Specify XMLNAMESPACE in SQL Server Query with For Xml Clause, Explicit mode

2k Views Asked by At

I'm trying to query some database using FOR XML clause EXPLICIT mode but i don't know how to specify the XMLNAMESPACE and schema's while using this mode just like WITH XMLNAMESPACE while using AUTO mode or RAW

This MSDN example query, in its result its specifies the Schema1 as a schema for the result 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

and here is sample result:

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

There are 1 best solutions below

0
On

The query from MSDN includes a schema because it uses the XMLDATA directive.

Specifies that an inline XML-Data Reduced (XDR) schema should be returned. The schema is prepended to the document as an inline schema. For a working sample, see Use RAW Mode with FOR XML.

If you want to include a namespace with explicit mode you have to add it yourself and name your elements and attributes accordingly.

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

Result:

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