Sql server 尝试将变量用作where子句

Sql server 尝试将变量用作where子句,sql-server,tsql,Sql Server,Tsql,我有一个情况,我可能有一个日期搜索,我可能没有。我有一个创建where子句的变量:where field1=date,如果有日期,否则我创建一个空白变量。问题是将其添加到sql语句的末尾 Select * from table + @where Select @ from table & @where 都不行 msg 102,15级,状态1,第65行 “+”附近的语法不正确 最佳实践是一个带有允许有空参数的代码的过程。如果做得不好,动态SQL可能会被注入,或者如果您有条件分支来添加更

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

Select * from table + @where 
Select @ from table & @where
都不行

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


最佳实践是一个带有允许有空参数的代码的过程。如果做得不好,动态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

您可以更改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

提示:使用动态SQL。动态SQL是一个很大的话题,但是如果你专门使用它来寻找动态搜索条件,还有很多要考虑的。有时候你绝对需要,有时候你不需要;有时候在服务器端构建查询是有意义的,有时候在客户端构建查询更有意义。这是个坏主意。最终会产生错误的执行计划。解决方案是要么使用动态SQL,要么与重新编译一起使用,要么首先不使用冗余参数