14

我有一个 SQL Server 2005 查询,它生成一个大型结果集(最多几 GB):

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

我想更改查询,以便它返回多行,而不是一行包含具有多个产品元素的单个文档的结果集,每个行都有一个包含单个产品元素的文档:

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

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

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

4

4 回答 4

23

我想你想要这样的东西。(你可以在 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
于 2012-12-24T13:24:50.830 回答
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)
于 2015-01-09T11:22:00.470 回答
2

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

SELECT ProductID,(SELECT Name, Price FOR XML RAW('Product'),ELEMENTS) AS RowXML
FROM  Production.Product AS a
于 2017-05-23T08:35:15.783 回答
1

如果 PRICE 和 NAME 在一个表中 Product

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'),这就是它生成包含所有产品的单个节点的原因。

于 2013-01-22T10:07:17.010 回答