我有一个带参数的表(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
[...]
如果没有光标,有没有更聪明的方法呢?
答案 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)
结果与预期一致。