【问题标题】:Union All With if/else T-SQL使用 if/else T-SQL 联合所有
【发布时间】:2010-11-26 20:02:41
【问题描述】:

我想知道如何使用带有 IF/ELSE 语句的 UNION ALL。

例如:

SELECT * FROM A
UNION ALL
SELECT * FROM B
UNION ALL

IF @type = 1
   BEGIN
      SELECT * FROM C
   END
ELSE
   BEGIN
      SELECT * FROM D
   END

UNION ALL

SELECT * FROM E

我收到语法错误。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:
    SELECT * FROM A 
    UNION ALL 
    SELECT * FROM B 
    UNION ALL 
    SELECT * FROM C WHERE @type = 1
    UNION ALL
    SELECT * FROM D WHERE @type <> 1 OR @type IS NULL
    UNION ALL 
    SELECT * FROM E ;
    

    【讨论】:

      【解决方案2】:

      一种方法是使用动态 sql

      首先构建查询字符串,然后执行它。这样你就可以完全控制

      declare query nvarchar(max)
      set query = 'SELECT * FROM A
                   UNION ALL
                   SELECT * FROM B
                   UNION ALL '
      
      IF @type = 1
      BEGIN
      set query = query + '
                  SELECT * FROM C'
      END
      ELSE
      BEGIN
      set query = query + '
                  SELECT * FROM D'
      END
      set query = 'UNION ALL
                   SELECT * FROM E'
      
      exec(query)
      

      【讨论】:

      • 好吧,现在不需要了 - 我提到这是一种方法,而且效果很好。仅当您通过连接参数而不对其进行清理来允许 sql 注入攻击时,动态 sql 才是不好的。
      • @Roopesh Shenoy:假设这是在存储过程中。调用者可以执行存储过程,但不能直接查询表(所有权链接)。像这样使用 EXEC 会失败:现在需要在表上授予权限。使用 EXECUTE AS OWNER 运行存储过程是不必要的升级。不是所有的 SQL 注入问题,而是简单的安全性问题……还是您将所有内容都作为 sa 或 db_owner 运行?
      • @gbn - 当开发人员没有正确考虑最终部署方案和安全模型时,这可能是 dba 的一个好问题。然而,它是一种标准语言功能,几乎在我使用过的所有数据库中都可用。
      • @Roopesh Shenoy:标准与否,在这种情况下,动态 SQL 会危及系统。安全永远不是事后的想法
      • - 1 到 gbn:存储过程是生活中的事实。我认为另一个答案更优雅,但这并不意味着这个答案不安全。
      猜你喜欢
      • 2012-11-13
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多