我已经搜索了一段时间,发现没有任何相关内容。
我们大量使用动态方法来处理大多数查询:
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抛出错误“子查询返回的值超过1。当子查询跟随=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。“
这是完全正常和预期的,我的问题是:
有没有办法动态地进行这种过滤?
我们使用的解决方案是:
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
也不是一个选项,抱歉。
答案 0 :(得分:1)
应如何使用表参数。
但是如果你想坚持这种方法。
Declare @ContactId VarChar(8000)
Select @ContactId = '1,2,3'
Select *
From Person.Contact
where ',' + @contactID + ',' like '%,'+convert(varchar(50),contactid)+',%'
答案 1 :(得分:0)
试试这个
Select *
From Person.Contact
Where (
len(@contactid) > 0 AND
ContactID IN (Select id From dbo.SplitString(@ContactId,',')))
or 1 = 1