我遇到的情况是我可能有一个要搜索的日期,而我可能没有。我有一个创建where子句的变量:where field1 = date,如果有日期,则创建一个空白变量。问题是将此添加到我的sql语句的末尾。
Select * from table + @where
Select @ from table & @where
都不行
msg 102,第15级,状态1,第65行 “ +”附近的语法不正确
答案 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