Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL存储过程的多个WHERE子句输入_Sql_Tsql_Stored Procedures - Fatal编程技术网

T-SQL存储过程的多个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

我在web表单上有一个多选列表框,其中列出了各种内部活动代码,用户可以根据所选代码过滤查询结果。我可以轻松地将单个代码作为参数添加到存储过程中,并使用WHERE子句过滤结果,如下所示:

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