2010-11-26 34 views
3

我在想如何使用IF/ELSE语句来创建一个UNION ALL。联合所有使用if/else T-SQL

例如:

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 

我得到的语法错误。

回答

14
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) 
+0

-1动态SQL一般是*坏*主意 – gbn 2010-11-26 20:10:06

+0

还好现在是多余的 - 我提到这是做的一种方式,并能正常工作。只有当您通过连接参数而不进行消毒来让sql注入攻击发生时,动态sql才是不好的。 – 2010-11-26 20:13:27