2013-05-21 4 views
3

Я пытаюсь использовать функцию SQL-сервера FOR XML для генерации некоторого XML с определенными пространствами имен.Как я могу использовать предложение WITH XMLNAMESPACES с коррелированными запросами?

Моя цель XML должен выглядеть примерно так:

<ns1:CustomerInvoices xmlns:ns1="urn:example.com:Invoice:01.00"> 
    <CustomerInvoice> 
    <Header> 
     <OrderDate>2001-11-13T00:00:00</OrderDate> 
     <SalesOrderNumber>SO44643</SalesOrderNumber> 
    </Header> 
    <Lines> 
     <LineTotal>3578.270000</LineTotal> 
     <UnitPrice>3578.2700</UnitPrice> 
     <OrderQty>1</OrderQty> 
    </Lines> 
    </CustomerInvoice> 
    <CustomerInvoice>...(abbreviated)...</CustomerInvoice> 
</ns1:CustomerInvoices> 

У меня есть проблема, в том, что, когда я использую пункт WITH XMLNAMESPACES, на множество дочерних узлов, которые партия потребителей третьей появляется объявление пространства имен этот XML будет "предпочитают не", то есть я делаю что-то вроде:

Use AdventureWorks2008 

;WITH XMLNAMESPACES ('urn:example.com:Invoice:01.00' as ns1) 

SELECT  (SELECT  hdr.OrderDate, 
         hdr.SalesOrderNumber 
      FOR XML PATH (''), TYPE) AS Header, 
      (SELECT  line.LineTotal, 
         line.UnitPrice, 
         line.OrderQty 

      FROM  Sales.SalesOrderDetail AS line 

      WHERE  line.SalesOrderID = hdr.SalesOrderID 
      FOR XML PATH (''), TYPE) AS Lines 

FROM  Sales.SalesOrderHeader AS hdr 

WHERE  hdr.ModifiedDate = '2001-11-20' 

FOR XML PATH('CustomerInvoice'), ROOT('ns1:CustomerInvoices') 

что дает:

<ns1:CustomerInvoices xmlns:ns1="urn:example.com:Invoice:01.00"> 
    <CustomerInvoice> 
    <Header> 
     <OrderDate xmlns:ns1="urn:example.com:Invoice:01.00">2001-11-13T00:00:00</OrderDate> 
     <SalesOrderNumber xmlns:ns1="urn:example.com:Invoice:01.00">SO44643</SalesOrderNumber> 
    </Header> 
    <Lines> 
     <LineTotal xmlns:ns1="urn:example.com:Invoice:01.00">3578.270000</LineTotal> 
     <UnitPrice xmlns:ns1="urn:example.com:Invoice:01.00">3578.2700</UnitPrice> 
     <OrderQty xmlns:ns1="urn:example.com:Invoice:01.00">1</OrderQty> 
    </Lines> 
    </CustomerInvoice> 
    <CustomerInvoice>...(abbreviated)...</CustomerInvoice> 
</ns1:CustomerInvoices> 

Можно ли настроить запрос, чтобы получить правильные пространства имен, или мне придется загрузить это в «что-то еще», чтобы удалить избыточные объявления пространства имен?

+0

Может быть повторением: http://stackoverflow.com/questions/3242070/how-do-i-remove-redundant-namespace-in-nested -query-when-use-for-xml-path – granadaCoder

+0

Также отображается http://stackoverflow.com/q/11221375/50447 –

ответ

4

Вы не одиноки.

http://connect.microsoft.com/SQLServer/feedback/details/265956/suppress-namespace-attributes-in-nested-select-for-xml-statements

Я хотел бы предложить upvoting, что улучшение.

Существует работа вокруг перечисленных на сайте средства выше:

http://www.olcot.co.uk/sql-blogs/suppressing-namespace-attributes-in-nested-select-statements-when-using-for-xml-workaround

APPEND/EDIT:

Второе звено я опубликовал выше теперь мертв.

Вот другая ссылка:

http://www.sqlservercentral.com/blogs/rocks/2012/08/28/suppressing-namespace-attributes-in-nested-select-statements-when-using-for-xml-workaround/

Смежные вопросы