Вопрос по sql-server, xml, sql, sql-server-2008 – Читать XML-документ, хранящийся в SQL Server 2008 R2 с типом данных XML

2

Я использую SQL Server 2008 R2 и ASP.NET 3.5. Я храню таблицу данных (.NET) на стороне SQL в форме XML. Столбец имеет тип данных XML.

Это пример того, как XML хранится на сервере SQL в столбце таблицы.

<container>
<NewDataSet>

<Containers>
  <BARCODE>680812</BARCODE>
  <CATEGORYID>114</CATEGORYID>
  <NAME>KS000147</NAME>
  <GWT>4.640</GWT>
  <NWT>4.640</NWT>
  <LAM>30.00</LAM>
  <QTY>2</QTY>
  <QUANTITY>1</QUANTITY>
  <REMARKS>HM</REMARKS>
</Containers>
<Containers>
  <BARCODE>680813</BARCODE>
  <CATEGORYID>114</CATEGORYID>
  <NAME>KS000147</NAME>
  <GWT>4.680</GWT>
  <NWT>4.680</NWT>
  <LAM>30.00</LAM>
  <QTY>2</QTY>
  <QUANTITY>1</QUANTITY>
  <REMARKS>HM</REMARKS>
</Containers>
<Containers>
  <BARCODE>680814</BARCODE>
  <CATEGORYID>114</CATEGORYID>
  <NAME>KS000147</NAME>
  <GWT>4.490</GWT>
  <NWT>4.490</NWT>
  <LAM>30.00</LAM>
  <QTY>2</QTY>
  <QUANTITY>1</QUANTITY>
  <REMARKS>HM</REMARKS>
</Containers>
</NewDataSet>
</container>

Теперь я хочу получить этот XML в форме табулара. Как мне написать запрос в SQL для извлечения XML в следующем табличном формате? то есть

BARCODE | CATEGORYID |NAME     |GWT   |NWT   |LAM   |QTY |QUANTITY |REMARKS 
680814  |    114     |KS000147 |4.490 |4.490 |30.00 | 2  |   1     |HM

Дайте мне знать, если вам нужно больше деталей.

Спасибо. Оно работает. Mike
Используйте OPENXML - NODES () тоже работает, но медленнее, чем OPENXML 2005/2008. NODES () только лучше, чем OPENXML 2012 ... OMG Ponies

Ваш Ответ

2   ответа
2

SELECT
    Barcode = Container.value('(BARCODE)[1]', 'int'),
    CategoryID = Container.value('(CATEGORYID)[1]', 'int'),
    Name = Container.value('(NAME)[1]', 'varchar(50)'),
    GWT = Container.value('(GWT)[1]', 'decimal(10, 3)'),
    NWT = Container.value('(NWT)[1]', 'decimal(10, 3)'),
    LAM = Container.value('(LAM)[1]', 'decimal(10, 3)'),
    QTY = Container.value('(QTY)[1]', 'int'),
    Quantity = Container.value('(QUANTITY)[1]', 'int'),
    Remarks = Container.value('(REMARKS)[1]', 'varchar(50)')
FROM
    dbo.YourTableHere
CROSS APPLY 
    XmlColumnHere.nodes('/container/NewDataSet/Containers') AS T(Container)
WHERE
    ID = 1

Это будет производить что-то вроде этого (для ваших данных образца):

enter image description here

Error: User Rate Limit Exceeded Mike
0

customer & gt ;, & lt; order & gt; и & lt; orderdetail & gt; элементы.

DECLARE @DocHandle int
Declare @XML NVARCHAR(MAX)
SET @XML = '<ROOT>
<Customer CustomerID="1" ContactName="vibhav bhavsar>
<Order OrderID="101" CustomerID="1" OrderDate="2014-01-01">
<OrderDetail ProductID="16" Quantity="11" Amount="200$">
One of the best customer
</OrderDetail>
<OrderDetail ProductID="57" Quantity="6" Amount="150$"/>
</Order>
</Customer>
<Customer CustomerID="2" ContactName="jay bhavsar">
<Order OrderID="102" CustomerID="2" OrderDate="2014-02-01">
<OrderDetail ProductID="12" Quantity="9" Amount="180$">
Customer was very satisfied
</OrderDetail>
<OrderDetail ProductID="7" Quantity="2" Amount="50$"/>
</Order>
</Customer> </ROOT>'

--Need to create an internal representation of the XML document.
EXEC sp_xml_preparedocument @DocHandle OUTPUT, @XML

--Execute a SELECT statement using OPENXML.
SELECT * 
FROM OPENXML (@DocHandle, '/ROOT/Customer/Order/OrderDetail')
WITH (OrderID int '../@OrderID',
CustomerID  varchar(10) '../../@CustomerID',
ContactName varchar(100) '../../@ContactName',
OrderDate   datetime '../@OrderDate',
ProductID  int '@ProductID',
Qty int '@Quantity',
Amount varchar(10) '@Amount',
Comment varchar(50) 'text()')

Оператор SELECT используется для извлечения всех столбцов в наборе строк, предоставленном OPENXML.

Для просмотра болеекликните сюда

Похожие вопросы