2014-11-17 45 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'。 –