我正在尝试为我的文档归档系统上的高级搜索页面编写查询。我正在尝试通过多个可选参数进行搜索。我有大约 5 个参数,它们可以是空字符串或搜索字符串。我知道我不必将每个检查为字符串或空,并为每个组合创建单独的存储过程。
编辑: 最终使用:
ISNULL(COALESCE(@var, a.col), '') = ISNULL(a.col, '')
您可以像这样使用 COALESCE (或 ISNULL):
WHERE COALESCE(@var1, col1) = col1
AND COALESCE(@var2, col2) = col2
AND COALESCE(@var3, col3) = col3
我通常这样做:P
WHERE (@var1 IS NULL OR col1 = @var1)
AND (@var2 IS NULL OR col2 = @var2)
...
您可以将 OR 放入 WHERE 子句中,如下所示:
WHERE
(@var1 = '' OR col1 = @var1) AND
(@var2 = '' OR col1 = @var2) AND
(@var3 = '' OR col1 = @var3) ...
另一种方法是在存储过程中动态构建 SQL,这会产生最佳的查询计划,并且无论如何都会创建和使用计划(2005 年及以上)。
您可以将可选参数传递给存储过程,但优化器将根据您对该过程进行的特定调用来构建计划。 SQL Server 2005 及更高版本中有一些技巧可以避免这种情况(参数嗅探、“不编译”提示等)
即便如此,我还是更喜欢构建一个具有查询核心的视图,然后在具有特定参数的多个过程中使用该视图。这允许 SQL 根据需要/应该进行优化,并且我仍然可以巩固查询细节。
更好的是让参数可选为 NULL,然后在 WHERE 子句中测试,就像空字符串情况一样...