尝试将变量用作where子句

时间:2019-06-24 14:31:28

标签: sql-server tsql

我遇到的情况是我可能有一个要搜索的日期,而我可能没有。我有一个创建where子句的变量:where field1 = date,如果有日期,则创建一个空白变量。问题是将此添加到我的sql语句的末尾。

Select * from table + @where 
Select @ from table & @where

都不行

  

msg 102,第15级,状态1,第65行   “ +”附近的语法不正确

2 个答案:

答案 0 :(得分:1)

最佳做法是使用允许使用NULL参数的代码的过程。如果执行不当,动态SQL可能会被注入,如果您有条件分支要在WHERE中添加更多的联接,子句等,则动态SQL可能难以维护。

CREATE PROCEDURE your_proc 
@search_date DATETIME

AS

BEGIN 

SELECT * 
FROM your_table
WHERE your_date_col >= ISNULL(@search_date, '9999-12-31')
END
GO 

现在,如果您有一个变量,则可以使用它来调用过程:

DECLARE @variable DATETIME = '2018-01-01'
EXEC your_proc @variable

或者,您可以将其保留为NULL并运行相同的代码:

EXEC your_proc NULL

答案 1 :(得分:0)

您可以更改where子句,以便仅在不为空的情况下使用该变量, 例如这样

declare @SearchValue date = null -- set a date here if you want to use this variable in the where clause

select t.* 
from   YourTable t
where  (@SearchValue is null or t.YourDateColumn = @SearchValue)

当变量@SearchValue为空时,将不会进行检查,因为括号之间的表达式已经为true

像这样,您可以避免使用动态sql