我有一个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进行任何更改以启用此方案吗?
答案 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