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

Tsql 重新编写此查询以使其更具可伸缩性,tsql,sql-server-2008,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

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

因此,该页面的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条件


如何使此查询更具可伸缩性,以便我不必编写一组新的IF-ELSE语句来检查每个条件,每次除了使用动态SQL之外,还向列表中添加了一个新的筛选器…

您必须拥有一个规则表,其中可能包含按位排列的公式,并构造一个可能从表中插入变量数据的查询和附加到字符串以形成sql,并使用动态sql运行它们

虽然我不喜欢动态SQL,但现在可能是使用它的时候了。您可以一次构建一点查询,然后在最后执行它

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

DECLARE @SQL VARCHAR(1000)
SELECT @SQL = 'SELECT * FROM ' + 'SOME_TABLE'
EXEC(@SQL)
确保处理SQL注入攻击、适当的间距等


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

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

您是从不同的表中为每个筛选器选择,还是WHERE子句发生了更改?更新了我的问题以反映您的查询。我看到您正在使用select设置@SQL的值。这套可以用,对吗?使用SELECT有好处吗?是的,我实际上可能会使用SET,但我从另一个网站上抓到了这个-我总是忘记是否在EXEC语句中包含paren,所以我先用谷歌搜索它,并且在我输入SELECT时没有注意到它。您还应该使用sp_executesql,以便直接在语句中使用的任何用户输入都可以作为参数传递给语句,从而有助于避免注入攻击。