如何在t-sql中读取xml?

Joh*_*ohn 2 t-sql sql-server-2008

谁能告诉我如何从以下xml中选择值:我想得到如下行:Col1:key,Col2:key,Col3:value

1 1 value
1 2 value2
1 3 value3

2 4 value4
2 5 value5
2 6 value6
Run Code Online (Sandbox Code Playgroud)

这是xml:

<root>
  <item>
    <key>1</key>
    <value>
      <params>
        <item>
          <key>1</key>
          <value>value</value>      
        </item>
        <item>
          <key>2</key>
          <value>value2</value>     
        </item>     
        <item>
          <key>3</key>
          <value>value3</value>     
        </item>     
      </params>
    </value>
  </item>
  <item>
    <key>2</key>
    <value>
      <params>
        <item>
          <key>4</key>
          <value>value4</value>     
        </item>
        <item>
          <key>5</key>
          <value>value5</value>     
        </item>     
        <item>
          <key>6</key>
          <value>value6</value>     
        </item>     
      </params>
    </value>
  </item>  
</root>
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 8

假设您在T-SQL变量中拥有此XML - 那么您可以使用以下代码片段:

DECLARE @input XML = '...(your XML here).....'

SELECT
    Key1 = Item.value('(key)[1]', 'int'),
    Key2 = Item2.value('(key)[1]', 'int'),
    ItemValue = Item2.value('(value)[1]', 'varchar(50)')
FROM 
    @input.nodes('/root/item') AS T(Item)
CROSS APPLY
    item.nodes('value/params/item') AS T2(Item2)
Run Code Online (Sandbox Code Playgroud)

这给了我一个输出:

Key1  Key2  ItemValue
 1     1     value
 1     2     value2
 1     3     value3
 2     4     value4
 2     5     value5
 2     6     value6  
Run Code Online (Sandbox Code Playgroud)

方法如下:

  • 使用第一个XQuery方法获取第一个"XML节点列表" <item>下的节点<root>列表.nodes(),并将<key>该XML片段中的XML元素的值提取到Key1

  • 抢XML片段中的XML节点的"嵌套"列表中,使用value/params/item的XPath,来获取子行-从提取值<key>,并<value>从这些嵌套的子XML片段成Key2ItemValue