最初のオプションは、where 句に別の存在を追加することです。
declare @fruitId1 int; set @fruitId1=1; declare @fruitId2 int; set @fruitId2=3; select * from @Test where BasketFruits.exist('/FRUITS/FID[.=sql:variable("@fruitId1")]')=1 and BasketFruits.exist('/FRUITS/FID[.=sql:variable("@fruitId2")]')=1
プレ>別のバージョンでは、xquery ステートメントで両方の変数を使用して、ヒットをカウントします。
select * from @Test where BasketFruits.value( 'count(distinct-values(/FRUITS/FID[.=(sql:variable("@fruitId1"),sql:variable("@fruitId2"))]))', 'int') = 2
プレ>上記の 2 つのクエリは、クエリを作成するときに使用する FID パラメータの数がわかっている場合に問題なく機能します。 FID の数が異なる状況にある場合は、代わりにこのようなものを使用できます。
declare @FIDs xml = '<FID>1</FID><FID>3</FID>' ;with cteParam(FID) as ( select T.N.value('.', 'int') from @FIDs.nodes('FID') as T(N) ) select T.BasketName from @Test as T cross apply T.BasketFruits.nodes('/FRUITS/FID') as F(FID) inner join cteParam as p on F.FID.value('.', 'int') = P.FID group by T.BasketName having count(T.BasketName) = (select count(*) from cteParam)
プレ>クエリで使用する値を保持するために、@FIDs 変数を XML として作成します。
ここで最後のクエリをテストできます:https://data .stackexchange.com/stackoverflow/q/101600/relational-division-with-xquery