我在网络表单上有一个多选列表框,列出了各种内部活动代码,用户可以根据所选代码过滤查询结果。我可以轻松地将单个代码作为参数添加到我的存储过程中,并使用WHERE子句过滤结果,如下所示:
WHERE ActivityCode = @ActivityCode OR @ActivityCode is null
但是处理多个代码的最佳做法是什么,特别是当所选代码的数量是任意的时?
答案 0 :(得分:4)
where isnull(@ActivityCode, ActivityCode) = ActivityCode
答案 1 :(得分:3)
您可以使用WHERE ActivityCode IN (@Code1, @Code2) OR ActivityCode IS NULL
答案 2 :(得分:2)
此:
WHERE ActivityCode = @ActivityCode OR @ActivityCode is null
...有效,但是not sargable。
如果您只有一个可选参数,则可以使用IF:
IF @ActivityCode IS NOT NULL
BEGIN
SELECT ...
FROM ...
WHERE ActivityCode = @ActivityCode
END
ELSE
BEGIN
SELECT ...
FROM ...
END
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT ...
FROM ...
WHERE 1 = 1 '
SET @SQL = @SQL + CASE
WHEN @ActivityCode IS NOT NULL THEN ' AND ActivityCode IN (@ActivityCode) '
ELSE ' '
END
BEGIN
EXEC sp_executesql @SQL, N'@ActivityCode VARCHAR(100)', @ActivityCode
END