使用XML.Query过滤多个值

时间:2009-08-13 07:46:34

标签: sql-server xml

我的表中有XML列,可以包含这两条记录的XML:

记录1,假设记录的ID为1,XML内容为

<content>
 <node1 >10</node1>
 <node2 >20</node2>
 <node3 >30</node3>
 <node4 >40</node4>
 <node5 >50</node5> 
</content>

记录2,假设记录的ID是2,XML内容是

<content>
 <node_name_1 >10</node_name_1>
 <hello >20</hello>
</content>

我想知道内部节点值为10的记录的ID。

declare @ids nvarchar(500)
set @ids = '10';
select id from tablename
 where
 convert(nvarchar(max),xmlfieldname.query('data(/content/* = ( sql:variable("@ids") )  )') ) = 'true'

这是完美的工作,但我的问题是当我想为内部节点使用多个值时。我想知道内部值为10或20的记录的ID。此查询非常有效:

 select id from tablename
 where
 convert(nvarchar(max),xmlfieldname.query('data(/content/* = ( 10,20 )  )') ) = 'true'

但是当我使用sql:variable时,没有返回任何内容!

declare @ids nvarchar(500)
set @ids = '10,20';
select id from tablename
 where
 convert(nvarchar(max),xmlfieldname.query('data(/content/* = ( sql:variable("@ids") )  )') ) = 'true'

我如何使用像mytable中的Select *这样的东西,其中在XML中的''123','456'中的fieldname?

1 个答案:

答案 0 :(得分:0)

你要求它找到该值为“10,20”的条目,就好像你在说“where fieldname in('10,20')”。

这是古老的斯普利特问题......

所以......试试:

declare @qry nvarchar(max);
select @qry = 'select id from tablename where convert(nvarchar(max),xmlfieldname.query(''data(/content/* = ( ' + @ids + ' )  )'') ) = ''true''';
exec sp_executesql @qry

罗布