1

セクション ID (int) を XML で列に格納し、XQuery を使用して、指定されたセクション ID を持つアイテムを検索します。セクション ID である int の配列を使用できるように (C# で) コードを拡張しようとしています。値がハードコーディングされている場合、コードは 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

変数は型であるため、式@stringvalueは次のように評価されます。

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

"(1,2)"これは、実際のシーケンスではなく、文字列値に一致します。変数がxmlデータ型であることを宣言します。評価すると、文字列表現ではなくシーケンスが返されます。

于 2013-01-29T20:36:47.617 に答える
0

動的 SQL を使用してこれを行うこともできますが、少しハックです。たとえば、次のようになります。

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 に答える