14

大きな結果セット(最大数ギガバイト)を生成するSQLServer2005クエリがあります。

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

クエリを変更して、複数の製品要素を持つ単一のドキュメントを含む1つの行の結果セットではなく、単一の製品要素で構成される単一のドキュメントを持つ複数の行を返すようにします。

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が1つのテーブルにある場合Product

SELECT * FROM Product FOR XML AUTO, ELEMENTS

または、そうでない場合は、必要な2つの列のみを返すビューvw_Productを作成して、次のように記述できます。

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 に答える