【问题标题】:SQL Use Declare to Omit Where Clause ItemsSQL 使用 Declare 省略 Where 子句项
【发布时间】:2016-06-06 19:56:34
【问题描述】:

有没有办法根据声明值排除部分 SQL 语句?

例如;

DECLARE @OnlyY as VARCHAR(1) = 'Y'

SELECT count(*) from main where IDATE > '2016-01-01' 

If @OnlyY = 'Y' THEN
    AND Qualify = 'Y'
END IF

在这种情况下,如果 @OnlyY 不是 Y,那么 if/endif 之间的部分根本不会发生。

我需要这个的原因是因为我正在将一个 Access 97 应用程序移植到 .NET。在 Access 97 应用程序中有一个部分创建一个临时表,然后从该表生成一个报告。涉及的 SQL 是一组巨大的 if/then 语句,它们从临时表中删除数据。我能够构建 DataTable 以在 Datagridview 中查看。我的问题是我无法让 SSRS 在 if/then 语句中具有与 .NET 相同的灵活性。

那我该怎么做呢?

【问题讨论】:

    标签: sql-server vb.net reporting-services


    【解决方案1】:

    试试这个:

    SELECT COUNT(*) 
    FROM main 
    WHERE IDATE > '2016-01-01' AND 
          ((Qualify = 'Y') OR (@OnlyY <> 'Y'))
    

    如果@OnlyY 不等于'Y',则WHERE 子句归结为:

    WHERE IDATE > '2016-01-01'
    

    否则,WHERE 子句变为:

    WHERE IDATE > '2016-01-01' AND (Qualify = 'Y')
    

    【讨论】:

      【解决方案2】:

      您可以查看的一个选项是Dynamic SQL,您可以在其中动态更改您需要的任何内容。

       DECLARE @SQL AS NVARCHAR(MAX)
       SET @SQL = N'SELECT COUNT(*) FROM main WHERE IDATE > ''2016-01-01'''
      
       IF @OnlyY = 'Y'
       BEGIN 
         SET @SQL += N' AND Qualify = ''Y'''
       END
      
       EXECUTE sp_executesql @SQL
      

      【讨论】:

      • 这正是我一直在寻找的。我必须把 () 放在'@OnlyY = 'Y' 周围,然后将 THEN 更改为 BEGIN,将 END IF 更改为 END。否则,谢谢。我不知道这是可能的。现在我只需要保护它免受注入攻击。
      • 欢迎,我错了。这个解决方案的好处是您可以动态地继续添加到您的where 子句。这样做的缺点是查询执行平原在这一点上没有优化,因为它是动态的并且没有缓存,但允许根据需要动态添加条件。
      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 2020-03-22
      • 2021-04-30
      • 2022-01-12
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多