1

我们将 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
4

2 回答 2

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)
于 2013-01-31T12:23:03.783 回答
0

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

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

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

于 2013-01-29T20:36:47.617 回答