0

私はしばらくの間SOを検索してきましたが、これに関連するものは何も見つかりませんでした。

このようなクエリのほとんどには、動的なアプローチを多用しています。

Declare @ContactId VarChar(8000)

Select @ContactId = '1'

Select * 
From Person.Contact
Where 1 = 1 And 
Case When Len(Ltrim(Rtrim(@ContactId))) = 0 Then 1 Else ContactID End =
Case When Len(Ltrim(Rtrim(@ContactId))) = 0 Then 1 Else @ContactId End

このようにして、パラメータに値がある場合、クエリは動的にフィルタリングされます

しかし、問題は次のように複数のIDで同じものを試すときに発生します。

Declare @ContactId VarChar(8000)

Select @ContactId = '1,2,3'

Select * 
From Person.Contact
Where 1 = 1 And 
Case When Len(Ltrim(Rtrim(@ContactId))) = 0 Then 1 Else ContactID End In (
Select Case When Len(Ltrim(Rtrim(@ContactId))) = 0 Then 1 Else ( Select id From dbo.SplitString(@ContactId,',') ) End )

SQLはエラーをスローします。「サブクエリが複数の値を返しました。これは、サブクエリが=、!=、<、<=、>、> =の後に続く場合、またはサブクエリが式として使用されている場合は許可されません。」

これは完全に正常であり、予想されることです。私の質問は次のとおりです。

この種のフィルタリングを動的に行う方法はありますか?

私たちが使用する解決策は次のとおりです。

Declare @Table Table(
    Col1    Int,
    Col2    Int,
    Col3    Int
)

Insert @Table
Select Col1, Col2, Col3
From Person.Contact
Where [many filters except the in clause filters]

If Len(Ltrim(RTrim(@ContactId))) > 0
    Select * 
    From @Table
    Where ContactId In ( Select Id From dbo.SplitString(@ContactId, ',') )
Else 
Select *
From @Table

ただし、クエリが大規模で、テーブル変数をフィードするのがやり過ぎの場合は、これはオプションではありません。私が私の主張を述べ、誰かが私がこれに対する解決策を見つけるのを手伝ってくれるのを助けてくれることを願っています。

PS:sp_ExecuteSqlこのシナリオでも、使用することはできません。申し訳ありません。

4

2 に答える 2

1

これを行う方法は、テーブルパラメータを使用することです。

しかし、このアプローチを継続したい場合。

Declare @ContactId VarChar(8000) 

Select @ContactId = '1,2,3'
Select *  
From Person.Contact 
where ',' + @contactID + ',' like '%,'+convert(varchar(50),contactid)+',%'
于 2012-10-17T21:41:13.960 に答える
0

これを試して

Select * 
From Person.Contact
Where (
           len(@contactid) > 0 AND 
           ContactID IN (Select id From dbo.SplitString(@ContactId,','))) 
or 1 = 1
于 2012-10-17T21:40:22.540 に答える