T-SQL存储过程的多个WHERE子句输入
我在web表单上有一个多选列表框,其中列出了各种内部活动代码,用户可以根据所选代码过滤查询结果。我可以轻松地将单个代码作为参数添加到存储过程中,并使用WHERE子句过滤结果,如下所示:T-SQL存储过程的多个WHERE子句输入,sql,tsql,stored-procedures,Sql,Tsql,Stored Procedures,我在web表单上有一个多选列表框,其中列出了各种内部活动代码,用户可以根据所选代码过滤查询结果。我可以轻松地将单个代码作为参数添加到存储过程中,并使用WHERE子句过滤结果,如下所示: WHERE ActivityCode = @ActivityCode OR @ActivityCode is null 但是处理多个代码的最佳实践是什么,特别是当所选代码的数量是任意的时?您可以使用,其中ActivityCode IN(@Code1,@Code2)或ActivityCode为NULL这: wh
WHERE ActivityCode = @ActivityCode OR @ActivityCode is null
但是处理多个代码的最佳实践是什么,特别是当所选代码的数量是任意的时?您可以使用
,其中ActivityCode IN(@Code1,@Code2)或ActivityCode为NULL
这:
where isnull(@ActivityCode, ActivityCode) = ActivityCode
…行得通,但事实并非如此
如果只有一个可选参数,则可以使用If:
IF @ActivityCode IS NOT NULL
BEGIN
SELECT ...
FROM ...
WHERE ActivityCode = @ActivityCode
END
ELSE
BEGIN
SELECT ...
FROM ...
END
供参考:
SQL Server 2005+
您通过哪种方法将任意数量的代码传递给进程?e、 表变量、XML、分隔列表、多个默认为空的参数等?你会考虑改变这个方法吗?这和我要找的最接近,虽然我最后用一个函数把代码转储到一个表中,然后用内部连接选择了活动代码。只是为了记录,因为这把我弄糊涂了…这个例子被称为“不可销售”。。。是这是sargable(与isnull()模式相反)的许多定义中使用的示例之一,包括本答案中链接到的示例。(5年后,这仍然出现在搜索结果中:))
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