存储过程中的SQL Server dynamic =运算符

时间:2015-03-16 02:30:52

标签: sql sql-server tsql stored-procedures

我对SQL Server中的动态运算符有疑问。

举个例子,

select * 
from table1 
where field_1 = 'ABC'

我们可以动态更改' ='根据参数?假设上述查询是否在存储过程中,并且我们有一个名为@para的参数。

我的问题是:

if @para = "x" then the '=' in the above query remains same
if @para = 'y' then '=' should change to '!='

可以这样做吗?

查询应该是

select * 
from table1 
where field_1 OPERATOR_FIELD 'ABC'

这个问题背后有一个原因。我有一个大型存储过程,并认为可以有一种简单的方法来动态更改操作符,而不是在整个地方编写CASE语句。

3 个答案:

答案 0 :(得分:4)

您可以将其写为:

where ((field_1 = 'ABC' and (@param = '=') ) or
       (field_1 <> 'ABC') and (@param = '<>') )
      )

否则您需要使用动态SQL。

答案 1 :(得分:1)

您可以使用动态SQL:

DECLARE @para VARCHAR(1) = 'y'
DECLARE @sql VARCHAR(MAX)

SET @sql =
'SELECT *
FROM table1
WHERE
    field_1 ' + CASE WHEN @para = 'x' THEN '=' ELSE '!=' END + ' ''ABC'''

PRINT @sql
EXEC(@sql)

另一种方式:

SELECT *
FROM table1
WHERE
    (@para = 'x' AND field_1 = 'ABC')
    OR (@para = 'y' AND field_1 != 'ABC')

阅读Gail Shaw关于动态搜索查询的blog post

以下是Erland Sommarskog的another post

答案 2 :(得分:0)

第一个答案是最简单的方法 调试时动态查询有点复杂

让我们更改此方法中的查询

if @para = '=' 
begin 

select * 
from table1 
where field_1 = 'ABC'

end 
else 
begin 
select * 
from table1 
where field_1 <> 'ABC'

end