提问前信息:
我正在编写一个存储过程,它会接受一些参数并依赖于那些参数(如果它们被填充 - 因为它们不一定是这样)我在几个where子句中添加了几个。问题是我不知道我是否会从一开始就使用where子句,因为我不知道我的任何一个参数是否会非空/非空。
程序内部看起来像cca:
BEGIN
DECLARE @strMySelect varchar(max)
SET @strMySelect ='SELECT myparams FROM mytable'
// add some WHERE statement(*)
IF(ISNULL(@myParamDate1,'')<>'')BEGIN
SET @strMySelect =@strMySelect +'
AND param1 >='''+CAST(@myParamDate1 as varchar(30))+''''
END
IF(ISNULL(@myParamDate2,'')<>'')BEGIN
SET @strMySelect =@strMySelect +'
AND param1 <='''+CAST(@myParamDate2 as varchar(30))+''''
END
//... bit more of these "AND"s
EXECUTE(@strExec)
问题: 是否正确(这样做的正确方法)在我的查询中加入一些WHERE statement that I know that will be always true所以我可以在我的参数案例中使用AND总是?或者我是否必须检查每个参数是否是第一个填充的或者是否有一种简单的方法来检查SQL中至少有一个参数不是NULL /空?
答案 0 :(得分:2)
我处理这样的可选参数:
where (
(@optionalParameter is not null and someField = @optionalParameter )
or
@optionalParameter is null
)
etc
我发现它更简单。
答案 1 :(得分:1)
从性能角度来看,您的额外where子句不是问题,因为查询优化器无论如何都会(可能)删除1 = 1条件。
但是,我建议按照Dan Bracuk建议的解决方案,原因有两个:
在某些情况下,您必须自定义构建查询字符串(例如,在将表名作为参数时),但我会尽可能避免使用它。
答案 2 :(得分:0)
您不需要使用EXEC功能来检查参数。一个好的做法是使用大小写来检查参数值,例如
CREATE PROCEDURE MyProc
@Param1 int = 0
AS
BEGIN
SELECT * FROM MyTable WHERE CASE @param1 WHEN 0 THEN @param1 ELSE MyField END = @Param1
END
GO
如果@param1没有值(默认为0),那么你有@param1 = @ param1,它总是为true,如果你有@param值,那么condition是MyField = @param1。