2012-03-21 1 views
2

Nous migrons une application d'Oracle vers SQL Server.Requête SQL Server renvoyant Xml et Html

Dans Oracle, une procédure utilisée pour renvoyer le code XML avec des balises HTML incorporées.

La source est ci-dessous.

SELECT XMLAGG (
       XMLFOREST (
        XMLELEMENT ("a", XMLATTRIBUTES ('#' AS "href"), MODULENAME) "h3", 
        XMLELEMENT (
        "ul", 
        XMLAGG (
         XMLELEMENT (
          "li", 
          XMLELEMENT (
           "a", 
           XMLATTRIBUTES (
           '#' AS "href", 
            'pageclick(''' 
           || SCREENPATH              
           || ''','|| SCREENID||')' AS "onclick"), 
           SCREENNAME)) 
          ORDER BY SORDER ASC)) "div") 
        ORDER BY MORDER ASC).getclobval() 

     FROM (SELECT B.SUBMODULEID MODULEID, 
        C.PAGEID SCREENID, 
        C.PAGENAME SCREENNAME, 
        C.PAGECODE, 
        B.SUBMODULEID, 
        B.SUBMODULENAME MODULENAME, 
        C.PAGEURLL1 SCREENPATH, 
        C.ORDERNO SORDER, 
        B.ORDERNO MORDER 
       FROM SETP.SM_PAGES C, 
        SETP.SM_MODULES A, 
        SETP.SM_SUB_MODULES B, 
        SETP.SM_USRPRIVHDR D, 
        SETP.SM_USRPRIVDTL E 
       WHERE  D.USRPRIVID = E.USRPRIVID 
        AND C.PAGEID = E.PAGEID 
        AND B.MODULEID = A.MODULEID 
        AND C.SUBMODULEID = B.SUBMODULEID 
        AND D.USRID = 2) page 
    GROUP BY MODULENAME, MORDER; 

et est ici la sortie

<h3> 
    <a href="#">Masters</a> 
</h3> 
<div> 
    <ul> 

     <li> 
      <a href="#" onclick="pageclick(&apos;WmsSetup.aspx/BaggingConfig&apos;,1177)">Bagging Configuration</a> 
     </li> 
     <li> 
      <a href="#" onclick="pageclick(&apos;WMS.aspx/Items&apos;,1171)">Item Master</a> 
     </li> 

    </ul> 
</div> 

J'ai partagerai mes cheveux pour obtenir le même dans SQL Server sans utiliser XSLT. Des idées?

Merci & Cordialement

+0

Quelle version de SQL Server? – JeffO

+0

SQL Server 2005 Prof/Ent. – Deb

+0

Maintenant, vous avez 15 points de réputation - vous pouvez donc ** upvote ** excellente réponse de Mikael, aussi! :-) –

Répondre

3

Cela semble que cela devrait fonctionner pour vous.

;with C as 
(

    -- Your derived table goes here 
    SELECT B.SUBMODULEID MODULEID, 
     C.PAGEID SCREENID, 
     . 
     . 
    FROM SETP.SM_PAGES C, 
     . 
     . 

) 
select '#' as "h3/a/@href", 
     MODULENAME as "h3/a", 
     (
     select '#' as "a/@href", 
       'pageclick('''+SCREENPATH+''','+SCREENID+')' as "a/@onclick", 
       SCREENNAME as "a" 
     from C as C2 
     where C1.MODULENAME = C2.MODULENAME and 
       C1.MORDER = C2.MORDER 
     for xml path('li'), root('ul'), type 
     ) as "div" 
from C as C1 
group by MODULENAME, MORDER 
for xml path('') 

J'utilise une expression de table commune (CTE) parce que je dois réutiliser la table dérivée pour construire les parties internes du XML.

Voici un exemple de travail avec une variable de table au lieu de votre sous-requête.

declare @T table 
(
    MODULEID int, 
    SCREENID varchar(10), 
    SCREENNAME varchar(35), 
    PAGECODE varchar(10), 
    SUBMODULEID int, 
    MODULENAME varchar(10), 
    SCREENPATH varchar(35), 
    SORDER int, 
    MORDER int 
) 

insert into @T values 
(1, '1177', 'Bagging Configuration', 'page', 3, 'Masters', 'WmsSetup.aspx/BaggingConfig', 4, 5) 
insert into @T values 
(1, '1171', 'Item Master', 'page', 3, 'Masters', 'WMS.aspx/Items', 4, 5) 

;with C as 
(
    select * 
    from @T 
) 
select '#' as "h3/a/@href", 
     MODULENAME as "h3/a", 
     (
     select '#' as "a/@href", 
       'pageclick('''+SCREENPATH+''','+SCREENID+')' as "a/@onclick", 
       SCREENNAME as "a" 
     from C as C2 
     where C1.MODULENAME = C2.MODULENAME and 
       C1.MORDER = C2.MORDER 
     for xml path('li'), root('ul'), type 
     ) as "div" 
from C as C1 
group by MODULENAME, MORDER 
for xml path('') 

Résultat:

<h3> 
    <a href="#">Masters</a> 
</h3> 
<div> 
    <ul> 
    <li> 
     <a href="#" onclick="pageclick('WmsSetup.aspx/BaggingConfig',1177)">Bagging Configuration</a> 
    </li> 
    <li> 
     <a href="#" onclick="pageclick('WMS.aspx/Items',1171)">Item Master</a> 
    </li> 
    </ul> 
</div> 
+0

Simplement Speechless !!! Merci beaucoup. – Deb

+0

Vous êtes les bienvenus. –

+0

Je n'ai absolument aucune idée de comment cela fonctionne ... mais j'ai été capable de le modifier pour ma propre requête. Merci beaucoup. – WuHoUnited