0

Ich brauche entweder Kategorien A und B von Datensätzen in eine #temptable einzufügen, in Abhängigkeit von bestimmten ZustandIF ... ELSE ... zwei sich gegenseitig ausschließende Einsätze in #temptable

Meine Pseudo-Code:

IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE #t1; 

IF {some-condition} 
    SELECT {columns} 
    INTO #t1 
    FROM {some-big-table} 
    WHERE {some-filter} 
ELSE 
    SELECT {columns} 
    INTO #t1 
    FROM {some-other-big-table} 
    WHERE {some-other-filter} 

Die beiden obigen SELECTs sind exklusiv (garantiert vom ELSE-Operator). Allerdings versucht SQL-Compiler mich auszutricksen und wirft die folgende Meldung:

There is already an object named '#t1' in the database. 

Meine Vorstellung von „Fixing“ dieses # t1 im Voraus und dann Ausführen eines einfachen INSERT INTO (anstelle von SELECT ... INTO) zu erstellen ist . Aber ich mag Minimalismus und frage mich, ob dies auf einfachere Weise erreicht werden kann, d. H. Ohne explizite CREATE TABLE # t1 im Voraus.

Btw warum gibt es mir keinen Fehler auf einer bedingten DROP TABLE in der ersten Zeile? Ich frage mich nur.

+1

Um Ihre letzte Frage zu beantworten; die "DROP TABLE # t1" wird nur ausgeführt, wenn die "IF" -Anweisung wahr zurückgibt, d. h. die Tabelle existiert. Wie Sie sagen, dass Sie vereinfachen möchten, könnten Sie das in 'IF EXISTS (OBJECT_ID ('tempdb .. # t1')) DROP TABLE # t1;'. –

+0

@PatrikBirgersson Ich verstehe es! Ich habe mich jedoch nicht gefragt, wie ich diese bestimmte Codezeile vereinfachen könnte. Es ging vielmehr um Inkonsistenz zwischen der Möglichkeit, eine bedingte SELECT ... INTO #TempTabelle ... in einem verzweigten IF ... ELSE-Block auszuführen, anstatt eine bedingte DROP-Operation einer #TempTable in der ersten Zeile ausführen zu können. Rajeshs Antwort löscht hier alle meine Zweifel. –

Antwort

2

Sie können nicht 2 temporäre Tabellen mit demselben Namen in einem einzelnen SQL-Stapel haben. Einer der MSDN-Artikel besagt "Wenn mehr als eine temporäre Tabelle in einer einzelnen gespeicherten Prozedur oder einem Batch erstellt wird, müssen sie unterschiedliche Namen haben". Sie können diese Logik mit 2 verschiedenen temporären Tabellen oder Tabellenvariablen/temporären Tabellen außerhalb des IF-Else-Blocks deklarieren lassen.

0

Mit einem Dyamic-SQL können wir diese Situation behandeln. Als Entwickler ist es keine gute Übung. Am besten, Tabellenvariable oder temporäre Tabelle zu verwenden.

IF 1=2 
BEGIN 
EXEC ('SELECT 1 ID INTO #TEMP1 
SELECT * FROM #TEMP1 
') 
END 
ELSE 
EXEC ('SELECT 2 ID INTO #TEMP1 
SELECT * FROM #TEMP1  
') 
+0

Danke, das würde definitiv zu einem bestimmten Punkt funktionieren, d. H. Es würde #temp auffüllen und dann alle Zeilen zurückgeben. Allerdings verwende ich #temp Tabelle in nachfolgenden Abfragen, die Ihren Ansatz nicht für meinen Fall geeignet macht. Ich habe am Ende eine #temp-Tabelle erstellt und sie mit INSERT INTO gefüllt ... –

Verwandte Themen