T-SQL-将多个XML节点值转换/转置为列

tri*_*nes 1 xml sql sql-server xquery

我在表中有一个简单的XML字段,该表在其节点内存储一个或多个值:

<MultiSelect>
  <ItemKey>38</ItemKey>
  <ItemKey>36</ItemKey>
</MultiSelect>
Run Code Online (Sandbox Code Playgroud)

如何以将这些值提取到结果中的列的方式查询此字段?

源数据:

RowKey    Format
-----------------
1         <MultiSelect><ItemKey>40</ItemKey></MultiSelect>
2         <MultiSelect><ItemKey>40</ItemKey><ItemKey>36</ItemKey></MultiSelect>
Run Code Online (Sandbox Code Playgroud)

追求结果:

RowKey   ItemKey
----------------
1        40
2        40
2        36
Run Code Online (Sandbox Code Playgroud)

我已经接近要在下面的查询中使用的位置,但这仅返回XML节点的名称,而不是其中的值:

SELECT 
    [RowKey],
    x.y.value('local-name(.)', 'varchar(max)') AS ItemKey

FROM
[tbl_MyDataTable] AS t
    cross apply t.[Format].nodes('MultiSelect/ItemKey') x(y)
Run Code Online (Sandbox Code Playgroud)

结果:

RowKey   ItemKey
----------------
1       ItemKey
2       ItemKey
2       ItemKey
Run Code Online (Sandbox Code Playgroud)

任何建议都可以收到!

mar*_*c_s 5

您接近了-尝试一下(由于这些都是INT数值,我建议INT您在XQuery中使用):

SELECT 
    [RowKey],
    x.y.value('(.)[1]', 'INT') AS ItemKey
FROM
    dbo.[tbl_MyDataTable] AS t
CROSS APPLY
    t.[Format].nodes('/MultiSelect/ItemKey') x(y)
Run Code Online (Sandbox Code Playgroud)

基本上,通过选择(.)[1],您可以选择节点的 -而不是名称(即ItemKey

  • 完善!非常感谢-您是明星! (2认同)