重写此查询以使其更具可伸缩性

时间:2010-07-09 13:28:59

标签: tsql sql-server-2008

我的网站上有一个页面,其中有多个下拉框作为过滤器。

因此该页面的SQL过程将是这样的

IF @Filter1 = 0, @Filter2 = 0, @Filter3 = 0
    BEGIN

          SELECT * FROM Table1        

    END

ELSE IF @Filter1 = 1, @Filter2 = 0, @Filter3 = 0
    BEGIN

          SELECT * FROM Table2        

    END

一开始,每个过滤器只有几个结果,所以没有那么多的排列。但是,添加了更多过滤器,现在有超过20个IF ELSE检查。

因此,如果每个过滤器有5个选项,我将需要进行5 * 5 * 5 = 125 IF ELSE检查以返回依赖于过滤器的数据。

更新 第一个过滤器改变WHERE条件,第二个过滤器向结果集添加更多表,第三个过滤器改变ORDER BY条件

如何使这个查询更具可伸缩性,除了使用动态SQL之外,每次将新的过滤器添加到列表时,我不必编写一堆新的IF ELSE语句来检查每个条件...

3 个答案:

答案 0 :(得分:1)

你必须有一个带有公式的规则表,可能是按位,并构造一个可能从表中插入变量数据的查询,并附加到一个字符串以形成sql并使用动态sql来运行它们。

答案 1 :(得分:0)

尽管我不喜欢动态SQL,但这可能是它的时间。您可以一次构建一个查询,然后在最后执行它。

如果您不熟悉,语法如下:

DECLARE @SQL VARCHAR(1000)
SELECT @SQL = 'SELECT * FROM ' + 'SOME_TABLE'
EXEC(@SQL)

确保处理SQL注入攻击,适当的间距等。

在这种情况下,我会尽力将此逻辑放在应用程序代码中,但这并不总是可行的。如果您正在使用LINQ-to-SQL或其他LINQ框架,那么您应该能够安全地执行此操作,但可能需要一些创造力才能正确构建LINQ查询。

答案 2 :(得分:0)

您可以设置一组视图,每个“过滤器”一个,然后根据选择的“过滤器”从相应的视图中进行选择。