在xml变量上选择多个行和列

时间:2012-06-05 16:42:18

标签: sql-server

通常我在过滤器中使用XML变量,因为它们易于使用。

考虑tablea,其中column1是主键:

declare @xml xml = '<column1>1</column1><column1>2</column1>'

select *
from tablea
where
    column1 in (select x.i.value('.', 'bigint') from @xml.nodes('/column1') x(i)) or
    @xml is null

它的工作原理是因为xml上的select返回两行,值为1和2。

现在我有一个tableb,带有复合主键column1和column2。所以:

declare @xml xml = '<row><column1>1</column1><column2>2</column2></row><row><column1>3</column1><column2>4</column2></row>'

如何在xml上写一个select来返回每一行和每一行,如:

column1 column2
1       2
3       4

1 个答案:

答案 0 :(得分:5)

declare @xml xml = '<row><column1 a="a">1</column1><column2>2</column2></row><row>' +
    '<column1>3</column1><column2>4</column2></row>'

select  col.value('data(column1[1])', 'int') as column1
,       col.value('data(column2[1])', 'int') as column2
from    @xml.nodes('/row') tbl(col)

Example at SQL Fiddle.