查询存储在SQL Server列中的XML数据

时间:2018-08-08 18:46:05

标签: sql sql-server xml xquery

我的表是XMLData,其中有XMLXMLField

该列中的数据如下:

<table>
  <id>{9ebef1ed-51f6-4160-b342-40fd1bf311c5}</id>
  <rows>
    <row>
      <columns>
        <column name="Batch" value="Test Batch 123" type="System.String" />
        <column name="PartNo" value="Sample123" type="System.String" />
        <column name="Note" value="Slight Color Variants" type="System.String" />
        <column name="ShipDate" value="05-August-2018" type="System.DateTime" />
        <column name="Qty" value="2" type="System.Int32" />
        <column name="DefaultKey" value="1" type="System.Int32" />
      </columns>
    </row>
    <row>
      <columns>
        <column name="Batch" value="Second Batch" type="System.String" />
        <column name="PartNo" value="SampleXyz" type="System.String" />
        <column name="Note" value="Release Date TBD" type="System.String" />
        <column name="ShipDate" value="01-September-2018" type="System.DateTime" />
        <column name="Qty" value="1" type="System.Int32" />
        <column name="DefaultKey" value="2" type="System.Int32" />
      </columns>
    </row>
  </rows>
  <key>DefaultKey</key>
  <total>0</total>
  <data />
  <parameters />
</table>

我想查询Batch,PartNo,Note,ShipDate,Qty,DefaultKey并检索值。

谢谢

1 个答案:

答案 0 :(得分:3)

尝试这样的事情:

SELECT
    Batch = XC.value('(column[@name="Batch"]/@value)[1]', 'varchar(50)'),
    PartNo = XC.value('(column[@name="PartNo"]/@value)[1]', 'varchar(50)'),
    Note = XC.value('(column[@name="Note"]/@value)[1]', 'varchar(50)'),
    ShipDate = XC.value('(column[@name="ShipDate"]/@value)[1]', 'varchar(50)'),
    Qty = XC.value('(column[@name="Qty"]/@value)[1]', 'int'),
    DefaultKey = XC.value('(column[@name="DefaultKey"]/@value)[1]', 'int')
FROM
    dbo.XmlData
CROSS APPLY
    XmlField.nodes('/table/rows/row/columns') AS XT(XC)

基本上,它使用XmlField列的XML,并根据.nodes()表达式中的XPath获取XML片段的“虚拟”表。从那里,它到达返回的XML片段,并提取出您感兴趣的单个值。