【问题标题】:Read XML document stored in SQL Server 2008 R2 with XML datatype使用 XML 数据类型读取存储在 SQL Server 2008 R2 中的 XML 文档
【发布时间】:2014-12-04 02:53:18
【问题描述】:

我正在使用 SQL Server 2008 R2 和 ASP.NET 3.5。我在 SQL 端以 XML 形式存储数据表 (.NET)。列的数据类型为 XML。

这是一个将 XML 存储在 SQL Server 中的表列中的示例。

<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

如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 使用 OPENXML -- NODES() 也可以,但在 2005/2008 上比 OPENXML 慢。 NODES() 仅比 2012 年的 OPENXML 好...

标签: sql sql-server xml sql-server-2008 tsql


【解决方案1】:

你可以试试这样的:

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

这将产生类似这样的输出(对于您给定的示例数据):

【讨论】:

    【解决方案2】:

    此示例中的 XML 文档包含 元素。

    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 提供的行集中的所有列。

    查看更多Click here

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多