在XQuery表达式中将Ints数组参数化为SQL变量

时间:2013-01-29 19:31:16

标签: c# sql tsql xquery xquery-sql

我们将XML中的部分ID(整数)存储在一个列中,并使用XQuery查找具有指定部分ID的项目。我正在尝试扩展代码(在C#中)以便能够使用作为节ID的整数数组。当值被硬编码时,代码在SSMS中正常工作。当我尝试在XQuery中使用sql:variable时,我没有得到任何结果。

declare @table table
(
  Sections nvarchar(200)
)

insert into @table values ('<sections><section value="1" /></sections>')
insert into @table values ('<sections><section value="2" /></sections>')

--This works
select * from @table where CONVERT(xml, Sections).exist('/sections/section[@value = (1,2)]') = 1

--This doesn't work :(
Declare @stringvalue nvarchar(50)
set @stringvalue = '(1,2)'
select * from @table where CONVERT(xml, Sections).exist('/sections/section[@value = sql:variable("@stringvalue")]') = 1

2 个答案:

答案 0 :(得分:0)

因为变量的类型为@stringvalue,所以表达式的计算结果为:

.exist('/sections/section[@value = "(1,2)"]') 

这匹配字符串值"(1,2)",而不是实际序列。将变量声明为xml数据类型。当你评估它时,它应该返回一个序列而不是字符串表示。

答案 1 :(得分:0)

你可以用动态SQL做到这一点,但它有点hacky,例如:

create table #table 
(
  Sections nvarchar(200)
)

insert into #table values ('<sections><section value="1" /></sections>')
insert into #table values ('<sections><section value="2" /></sections>')

Declare @stringvalue nvarchar(50)
declare @sql nvarchar(max)
set @stringvalue = '(1,2)'

set @sql = 'select * from #table where CONVERT(xml, Sections).exist(''/sections/section[@value = ' + @stringvalue + ']'') = 1'
exec(@sql)