TSQL:FOR XML的每行元素一行

时间:2012-12-21 00:58:57

标签: tsql for-xml

我有一个SQL Server 2005查询生成一个大的结果集(最多几千兆字节):

SELECT * FROM Product FOR XML PATH('Product')

运行查询会生成一行,其中包含包含许多产品元素的文档:

Row 1:
<Product>
  <Name>Product One</Name>
  <Price>10.00</Price>
</Product>
<Product>
  <Name>Product Two</Name>
  <Price>20.00</Price>
</Product>
...

我想更改查询,以便使用一行包含包含多个产品元素的单个文档而不是结果集,而是返回多行,每行包含一个由单个Product元素组成的单个文档:

Row 1:
<Product>
  <Name>Product One</Name>
  <Price>10.00</Price>
</Product>

Row 2:
<Product>
  <Name>Product Two</Name>
  <Price>20.00</Price>
</Product>

最后,我想使用IDataReader从C#中使用此查询,而不使用SQL Server或我的应用程序将整个结果集加载到内存中。我可以对SQL进行任何更改以启用此方案吗?

4 个答案:

答案 0 :(得分:18)

我认为你想要这样的东西。(你可以在AdventureWorks上运行以下查询)

SELECT ProductID
      ,( SELECT * FROM Production.Product AS b WHERE a.ProductID= b.ProductID FOR XML PATH('Name') ) AS RowXML
FROM  Production.Product AS a

答案 1 :(得分:2)

我认为这会给你带来好结果,

SELECT top 3 Productid,Name, XmlColumn from Production.Product a cross apply ( select  top 1  a.* from Production.Product b FOR XML PATH('test')) as outputdata(XmlColumn)

答案 2 :(得分:1)

如果PRICE和NAME在一个表格产品

SELECT * FROM Product FOR XML AUTO, ELEMENTS

或者,如果没有,你可以创建一个视图vw_Product,它只返回你想要的2列,然后写

SELECT * FROM vw_Product as Product FOR XML AUTO, ELEMENTS

您可以使用XmlReader逐行读取此查询的结果,以避免在内存中加载大型XML文档。 见http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executexmlreader.aspx

在您的查询中,您使用了PATH('Product'),这就是为什么它生成了包含所有产品的单个节点。

答案 3 :(得分:1)

如果你知道列名,我宁愿避免嵌套选择表

SELECT ProductID,(SELECT Name, Price FOR XML RAW('Product'),ELEMENTS) AS RowXML
FROM  Production.Product AS a