【问题标题】:SQL Server query returning Xml and HtmlSQL Server 查询返回 Xml 和 Html
【发布时间】:2012-04-05 22:17:12
【问题描述】:

我们正在将应用程序从 oracle 迁移到 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;

这是输出

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

在不使用 XSLT 的情况下,我一直在努力在 SQL Server 中实现相同的目标。 有什么想法吗?

感谢和问候

【问题讨论】:

  • 现在您获得了 15 个声望点 - 所以您也可以投票 Mikael 的出色回答! :-)
  • 谢谢!但是我该怎么做呢?

标签: xml tsql sql-server-2005 oracle11g for-xml


【解决方案1】:

这看起来应该适合你。

;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),因为我需要重用派生表来构建 XML 的内部部分。

这是一个使用表变量而不是您的子查询的工作示例。

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

结果:

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

【讨论】:

  • 我完全不知道它是如何工作的......但我能够根据自己的查询对其进行修改。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多