SQL Insert Into Temp Table in beiden If-und Else-Blöcken
Ich versuche, füllen Sie eine temp-Tabelle, basierend auf dem Ergebnis der Bedingung in SQL 2005. Die temp-Tabelle haben die gleiche Struktur, aber wird aufgefüllt werden, mit einer anderen Abfrage, je nach Zustand. Das vereinfachte Beispiel-script unten scheitert in der syntax-Prüfung der ELSE
block INSERT INTO
mit dem Fehler:
Es ist bereits ein Objekt mit dem Namen
'#MyTestTable " in der Datenbank.
DECLARE @Id int
SET @Id = 1
IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable
IF (@Id = 2) BEGIN
SELECT 'ABC' AS Letters
INTO #MyTestTable;
END ELSE BEGIN
SELECT 'XYZ' AS Letters
INTO #MyTestTable;
END
Ich könnte die temp-Tabelle vor den IF/ELSE
Anweisung und nur dann nicht INSERT SELECT
Aussagen in den Bedingungen blockiert, aber die Tabelle viele Spalten und ich war versucht, effizient zu sein darüber. Ist das die einzige option? Oder gibt es eine Möglichkeit, diese Arbeit zu machen?
Dank,
Matt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist nicht, dass Sie bevölkern die temp-Tabelle, sondern, dass du versuchst zu erstellen den Tisch. SQL analysiert Ihr Skript und findet, dass Sie versuchen, es schaffen, in zwei verschiedenen Orten, und so löst einen Fehler aus. Es ist nicht klug genug, um zu erkennen, dass die "Ausführungspfad" können vielleicht traf sowohl das erstellen statemements. Mit dynamischem SQL wird nicht funktionieren; ich habe versucht,
aber die temp-Tabelle dauert nur so lange, wie die dynamische session. So, leider, wie es aussieht, müssen Sie zuerst deklarieren Sie die Tabelle und füllen Sie es. Umständlich code zu schreiben und zu unterstützen, vielleicht, aber effizient genug.
Beantwortung 8 Jahre zu spät, aber ich bin überrascht, dass niemand gedacht:
Einfach, schnell, und es funktioniert. Kein dynamisches sql erforderlich
In dem Szenario, das Sie bieten, Sie könnten dies tun
Aber sonst werden Sie brauchen, um die Tabelle zu erstellen, bevor die
if statement
wie dieseHier ist eine Lösung, die ich verwenden, wenn die temp-Tabelle kann nicht erstellt werden, im Voraus und nicht möchten, um core-Logik in dynamic SQL.
Dies ist ein altes Thema, aber für alle anderen kommt hier:
Den dynamischen SQL-Antwort, die durch den Benutzer Philip Kelley funktioniert nicht für lokale temporäre Tabellen (
#Mytemp
). Was Sie tun können, ist die Erstellung von dynamischen SQL-einfügen in eine Globale temporäre Tabelle (##MyTemp
), die können später gelöscht werden.dieser code kann Ihnen helfen,
dieser code funktioniert in sql server 2014
ich weiß nicht, ob es funktioniert in sql 2005-oder nicht
Habe ich versucht, dieses:
Diese Lösung ist besser, wenn Sie später brauchen, um Spalten hinzufügen #MyTestTable, denn sonst müssen Sie physisch ablegen, bevor Sie re-führen Sie Ihr Skript, das ist ärgerlich iin Bedingungen testen.
Du könntest die Tabelle löschen, bevor Sie die Auswahl IN es in beiden Fällen., z.B.:
Update Nach Dem Kommentar:
Das ist ärgerlich.
Wie über zwei getrennte temp Tabellen? Dann nach dem If/Else-login haben, überprüfen Sie für die Existenz jedes einzelnen und wenn es vorhanden ist, wählen Sie in einem Dritten temp-Tabelle? Das darf nicht toll, aber ob das ankommt oder nicht, hängt davon ab, was Sie brauchen es für.
IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable
in jedem block vor derINSERT INTO
Aussage, resultierte aber in der gleichen.IF/ELSE
.