2014-11-17 86 views
0

我有一個複雜的XML結構,我想從數據庫中的單個表創建。我設法像5個不同的節點添加如下:FOR XML EXPLICIT - 需要一種聰明的方式來查詢XML

SELECT 1 AS Tag 
,NULL AS Parent 
,NULL AS [Document-OrderResponse!1] 
,NULL AS [OrderResponse-Header!2] 
,NULL AS [OrderResponseType!3] 
,NULL AS [OrderResponseNumber!4] 
,NULL AS [OrderResponseDate!5] 
,NULL AS [OrderNumber!6] 
,NULL AS [DocumentFunctionCode!7] 
,NULL AS [DetailsOfTransport!8] 
,NULL AS [TermsOfDelivery!9] 

UNION ALL 

SELECT 2 AS Tag 
    ,1 AS Parent 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 

UNION ALL 

SELECT 3 AS Tag 
    ,2 AS Parent 
    ,NULL 
    ,NULL 
    ,'Type' 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 

UNION ALL 

SELECT 4 AS Tag 
    ,2 AS Parent 
    ,NULL 
    ,NULL 
    ,NULL 
    ,'Number' 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 

UNION ALL 

SELECT 5 AS Tag 
    ,2 AS Parent 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,'Date' 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
FOR XML explicit 

最後文件將被更多的嵌套,並有將是大約15多個值。如果我繼續構建這樣的查詢,它將只有幾頁。幫助我重新創建它。

結果看起來是這樣的(不換行和縮進):

<Document-OrderResponse> 
    <OrderResponse-Header> 
     <OrderResponseType>Type</OrderResponseType> 
     <OrderResponseNumber>Number</OrderResponseNumber> 
     <OrderResponseDate>Date</OrderResponseDate> 
    </OrderResponse-Header> 
</Document-OrderResponse> 
+0

我會去嘗試,用標準的C#LINQ /的XElement構建生成輸出CLR過程,假設在你的環境中的一個選項。 – MarcE

+0

我寧願不這樣做,因爲我對這些技術沒有經驗。我猜它在SQL中很容易實現,但是我錯過了一些東西。也許我應該把數據放到不同的表格中並使用FOR XML AUTO,ELEMENTS? – BuahahaXD

+3

'FOR XML PATH()'是你最好的選擇。 –

回答

1

嘗試FOR XML PATH()代替。

您的查詢可能會是這個樣子:

select T.OrderResponseType, 
     T.OrderResponseNumber, 
     T.OrderResponseDate 
from YourTable as T 
for xml path('OrderResponse-Header'), root('Document-OrderResponse') 
+0

如果數據是一個空字符串,有沒有辦法保留開放的XML標籤?在這種情況下,XML看起來像這個而不是。 – BuahahaXD

+1

@ŁukaszKastelik它是真的一樣的東西,所以它不應該。有時可能會強制SQL Server生成一個或另一個。嘗試在查詢的末尾添加',type'。 –