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

Я хотел бы изменить запрос так, чтобы вместо набора результатов с одной строкой, содержащей один документ с несколькими элементами продукта, он возвращает несколько строк, каждый с одним документом, состоящим из пения Элемент продукта:

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 без SQL Server или моего приложения, имеющего весь набор результатов, загруженный в память. Есть ли какие-либо изменения, которые я мог бы внести в SQL, чтобы включить этот сценарий?

Ответ 1

Я думаю, вам нужно что-то вроде этого (вы можете запустить ниже запрос на 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

Ответ 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)

Ответ 3

если 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 ( "Продукт" ), поэтому он создал один node со всеми продуктами.

Ответ 4

Если вы знаете имена столбцов, я бы предпочел избежать вложенного выбора в таблицу

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