将多个xml单元格转换为行

时间:2014-07-08 13:04:26

标签: sql-server xml tsql

我有一个带参数的表(id和value)。有些参数包含存储为xml的整数列表,即

id, val
=========
1, '<ArrayOfInt><int>3</int><int>7</int></ArrayOfInt>'
2, '<ArrayOfInt><int>8</int><int>10</int><int>15</int></ArrayOfInt>'

我想得到这样的结果:

id, val
=======
1, 3
1, 7
2, 8
2, 10
2, 15

使用临时表和游标执行此操作非常简单(但我想避免这种情况)。 例如:对于每一行检索xml和:

[...]
WHILE @@FETCH_RESULT = 0
BEGIN
  INSERT INTO #tmp
  SELECT
      @id,
      x.ArrayOfInt.value('.','int')
  FROM @xml.nodes('//ArrayOfInt/int') x(ArrayOfInt)
  FETCH NEXT FROM cur INTO @id, @xml
END
[...]

如果没有光标,有没有更聪明的方法呢?

1 个答案:

答案 0 :(得分:1)

事实证明,我非常接近自己得到答案。为了得到我写的结果:

declare @params table 
(
  id int identity(1,1),
  val xml
)

insert into @params (val) values ('<ArrayOfInt><int>3</int><int>7</int></ArrayOfInt>')
insert into @params (val) values ('<ArrayOfInt><int>8</int><int>10</int><int>15</int></ArrayOfInt>')


SELECT      
    p.id,
    tab.ArrayOfInt.value('(.)','int') as val
FROM @params p
  CROSS APPLY p.val.nodes('/ArrayOfInt/int') as tab(ArrayOfInt)

结果与预期一致。