我们将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
答案 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)