在SQL中执行动态条件搜索的更好方法?

时间:2011-09-09 21:57:11

标签: sql tsql sql-server-2008-r2

我们这里有一个大型查询,它有几个参数,对于每个参数,查询只有where子句的一部分不同,如下所示:

CASE WHEN @IncludeNames = 1 AND @NameFilter IS NULL THEN

(SELECT blah FROM blahBlah

    INNER JOIN ... 
    INNER JOIN ...
    INNER JOIN ...
    WHERE blahBlah.Id = x.Id)

WHEN @IncludeNames = 1 AND @NameFilter IS NOT NULL THEN

(SELECT blah FROM blahBlah

    INNER JOIN ... 
    INNER JOIN ...
    INNER JOIN ...
    WHERE blahBlah.Id = x.Id
    AND table2.Id = @NameFilter

对于几个实例,它继续发生,仅在where子句上有一个条件。

请记住,这是一个更大的选择。

有没有一种很好的方法来清理它,而不是将它全部放在一个大的连接的sql字符串中并在其上运行exec,或者使用像每个块的多个存储过程那样荒谬的东西,如下所示:{{ 3}}

服务器是SQL Server 2008 R2。 TIA!

1 个答案:

答案 0 :(得分:2)

尝试使用每个子句的全部或特定值选项设置查询,例如

SELECT x.*
FROM   x
WHERE  (x.id = @NameFilter
OR     @NameFilter is null)
AND    (x.typeId = @typeFilter
OR     -1 =  @typeFilter)
AND    (x.date = @date
OR     @date is null)
AND    (x.someStingType = @someStringType
Or     '' = @someStringType)

这应该允许您将子句连接到单个select语句中。每个参数都可以应用过滤器或没有效果(如果设置为默认值,例如null,空字符串或-1)。