2

属性が可能な値のリストにあるすべての行を返すために XML 列をクエリしようとしています。

XQueryは次のようなものを許可します

SELECT COUNT(*) 
FROM table
WHERE xml_col.exist('//Field.[@name=("value1","value2","value3")]') = 1

これは、@name 属性が「value1」、「value2」、または「value3」のいずれかに設定された Field を持つレコードの数を返します。

私がやりたいのは、セット「value1」、「value2」、「value3」を入力パラメーターとして処理できる簡潔なクエリを作成することです。

DECLARE @list NVARCHAR(100)

SET @list = '("value1","value2","value3")'

SELECT COUNT(*) 
FROM table
WHERE xml_col.exist('//Field.[@name=sql:variable("@list")]') = 1

もちろん、これは無効です。任意の提案をいただければ幸いです!

4

3 に答える 3

1

次の構成を試すことができます。

select count(1)
from [table] t
where exists (
    select 1 from (values ('value1'),('value2'),('value3')) l(v)
    where t.xml_col.exist('//Field[@name=sql:column("l.v")]') = 1);

また、次の方法で、テーブル変数またはテーブル値パラメーターと共に使用できます。

declare @list table (value varchar(100))
insert into @list values ('value1'),('value2'),('value3')

また

create type ListOfValues as table (value varchar(100))
GO
declare @list ListOfValues
insert into @list values ('value1'),('value2'),('value3')

その後

select count(1)
from [table] t
where exists(select 1 from @list l
    where t.xml_col.exist('//Field[@name=sql:column("l.value")]') = 1);
于 2013-08-18T00:37:33.860 に答える
1

おそらく、この場合、SQL 側で確認する方が簡単でしょう。

SELECT COUNT(*) 
FROM table
WHERE xml_col.value('(//Field/@name)[1]', 'nvarchar(255)') in ('value1', 'value2', 'value3')

少なくともField、XML に要素が 1 つしかない場合はこれでうまくいきますが、そうでない場合はもう少し複雑になります。

于 2013-08-16T21:18:20.910 に答える