2010-11-26 10 views
3

Ich frage mich, wie ich eine UNION ALL mit IF/ELSE-Anweisung haben kann.Union Alle Mit if/else T-SQL

Zum Beispiel:

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 

ich Syntaxfehler.

Antwort

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 ; 
+0

+1 schlagen Sie mir –

+0

+1 für NULL Handhabung – gbn

2

Nun ja, eine Möglichkeit, es zu tun ist, dynamischer SQL verwendet

zuerst das Query-String bauen und sie dann ausführen. Auf diese Weise können

volle Kontrolle haben
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 Dynamisches SQL ist in der Regel eine schlechte * * Idee – gbn

+0

okay, jetzt, da ist ungerufen - ich erwähnte, dass dies ist ein Weg, es zu tun, und es funktioniert gut. Dynamische SQL ist nur dann schlecht, wenn Sie SQL-Injection-Angriffe durch Verketten von Parametern durchführen, ohne sie zu bereinigen. –

+0

@Ropesh Shenoy: Lassen Sie uns sagen, dass dies in einem gespeicherten Prozess ist. Der Aufrufer kann die gespeicherten proc- aber nicht query-Tabellen direkt ausführen (Besitzverkettung). Die Verwendung von EXEC wird fehlschlagen: Berechtigungen müssen jetzt für die Tabellen erteilt werden. Das Ausführen des gespeicherten Proc mit EXECUTE AS OWNER ist eine unnötige Eskalation. Es sind nicht alle SQL-Injection-Probleme, sondern einfache Sicherheit ... oder führen Sie alles als sa oder db_owner aus? – gbn