2012-03-21 14 views
2

アプリケーションをOracleからSQL Serverに移行しています。XmlとHtmlを返すSQL Serverクエリ

Oracleでは、一部のHTMLタグが埋め込まれたXMLを返すためのプロシージャです。

ソースは以下のとおりです。

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; 

と、ここで私は、XSLTを使用せずにSQL Serverで同じことを達成するために私の髪を分割されている出力

<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> 

です。 アイデアそれはあなたのために働く必要があるよう&よろしく

+0

? – JeffO

+0

SQL Server 2005 Prof/Ent。 – Deb

+0

あなたは15の評判ポイントを手に入れました。 :-) –

答えて

3

おかげでこれが見えます。私は、XMLの内部部品を構築するために派生テーブルを再利用する必要があるため

;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('') 

私は、共通テーブル式(CTE)を使用しています。

ここでは、サブクエリーの代わりにテーブル変数を使用した実例があります。

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('') 

結果:SQL Serverのバージョン

<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

Simply Speechless !!!ありがとうございました。 – Deb

+0

ようこそ。 –

+0

これはどういう仕組みか全く分かりませんが、私自身のクエリでそれを修正することができました。どうもありがとうございました。 – WuHoUnited