【问题标题】:Specify XMLNAMESPACE in SQL Server Query with For Xml Clause, Explicit mode在 SQL Server 查询中使用 For Xml 子句、显式模式指定 XMLNAMESPACE
【发布时间】:2012-07-09 08:31:33
【问题描述】:

我正在尝试使用 FOR XML 子句 EXPLICIT 模式查询一些数据库,但我不知道如何在使用此模式时指定 XMLNAMESPACE 和架构,就像使用 AUTO 模式或 @987654324 时的 WITH XMLNAMESPACE 一样@

MSDN 示例查询在其结果中指定Schema1 作为结果XML 的架构

USE AdventureWorks2012;
GO
 SELECT  1 as Tag,
0 as Parent,
SalesOrderID  as [OrderHeader!1!SalesOrderID!id],
OrderDate     as [OrderHeader!1!OrderDate],
CustomerID    as [OrderHeader!1!CustomerID],
NULL          as [SalesPerson!2!SalesPersonID],
NULL          as [OrderDetail!3!SalesOrderID!idref],
NULL          as [OrderDetail!3!LineTotal],
NULL          as [OrderDetail!3!ProductID],
NULL          as [OrderDetail!3!OrderQty]
FROM   Sales.SalesOrderHeader
WHERE  SalesOrderID=43659 or SalesOrderID=43661
....
SELECT 3 as Tag,
 1 as Parent,
SOD.SalesOrderID,
NULL,
NULL,
SalesPersonID,
SOH.SalesOrderID,
LineTotal,
ProductID,
OrderQty   
FROM    Sales.SalesOrderHeader SOH,Sales.SalesOrderDetail SOD
 WHERE   SOH.SalesOrderID = SOD.SalesOrderID
 AND     (SOH.SalesOrderID=43659 or SOH.SalesOrderID=43661)
 ORDER BY [OrderHeader!1!SalesOrderID!id], [SalesPerson!2!SalesPersonID],
  [OrderDetail!3!SalesOrderID!idref],[OrderDetail!3!LineTotal]
 FOR XML EXPLICIT, XMLDATA

这是示例结果:

    <Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data"                   xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <ElementType name="OrderHeader" content="mixed" model="open">
    <AttributeType name="SalesOrderID" dt:type="id" />
    <AttributeType name="OrderDate" dt:type="dateTime" />
    <AttributeType name="CustomerID" dt:type="i4" />
    <attribute type="SalesOrderID" />
    <attribute type="OrderDate" />
    <attribute type="CustomerID" />
     </ElementType>
      <ElementType name="SalesPerson" content="mixed" model="open">
    <AttributeType name="SalesPersonID" dt:type="i4" />
    <attribute type="SalesPersonID" />
       </ElementType>
       <ElementType name="OrderDetail" content="mixed" model="open">
    <AttributeType name="SalesOrderID" dt:type="idref" />
    <AttributeType name="LineTotal" dt:type="number" />
    <AttributeType name="ProductID" dt:type="i4" />
    <AttributeType name="OrderQty" dt:type="i2" />
    <attribute type="SalesOrderID" />
    <attribute type="LineTotal" />
    <attribute type="ProductID" />
    <attribute type="OrderQty" />
        </ElementType>
      </Schema>
      <OrderHeader xmlns="x-schema:#Schema1" SalesOrderID="43659" OrderDate="2001-07-01T00:00:00"    CustomerID="676">
      <SalesPerson SalesPersonID="279" />
     <OrderDetail SalesOrderID="43659" LineTotal="10.373000" ProductID="712" OrderQty="2" />
     ...
    </OrderHeader>
     ...

【问题讨论】:

    标签: sql-server xml for-xml-explicit


    【解决方案1】:

    来自 MSDN 的查询包含一个架构,因为它使用 XMLDATA 指令。

    指定内联 XML 数据缩减 (XDR) 架构应该是 回来。模式作为内联模式附加到文档中。 有关工作示例,请参阅将 RAW 模式与 FOR XML 结合使用。

    如果你想包含一个显式模式的命名空间,你必须自己添加它并相应地命名你的元素和属性。

    declare @T table
    (
      id int,
      title varchar(50)
    )
    
    insert into @T values(451, 'Receptionist')
    insert into @T values(1025, 'Secretary')
    
    select 1    as Tag,
           null as Parent,
           'xx.yy.zz' as [root!1!xmlns:ns],
           null as [ns:item!2!ns:id],
           null as [ns:item!2!ns:title]
    union all
    select 2    as Tag,
           1 as Parent,
           null,
           id,
           title
    from @T 
    for xml explicit
    

    结果:

    <root xmlns:ns="xx.yy.zz">
      <ns:item ns:id="451" ns:title="Receptionist" />
      <ns:item ns:id="1025" ns:title="Secretary" />
    </root>
    

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2016-06-30
      • 2018-09-23
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多