Ich verwende den folgenden Code, um zu überprüfen, ob die temporäre Tabelle vorhanden ist, und die Tabelle zu löschen, falls sie vorhanden ist, bevor ich sie erneut erstelle. Es funktioniert gut, solange ich die Spalten nicht ändere. Wenn ich später eine Spalte hinzufüge, wird der Fehler "ungültige Spalte" angezeigt. Bitte lassen Sie mich wissen, was ich falsch mache.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
select company, stepid, fieldid from #Results
--Works fine to this point
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
select company, stepid, fieldid, NewColumn from #Results
--Does not work
BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT
. Wenn die Transaktion erfolgreich ist, wird die Tabelle entfernt. Wenn dies fehlschlägt, wird auch die Tabelle gelöscht (da sie innerhalb der Transaktion erstellt wurde). In jedem Fall: Sie müssen nicht überprüfen, ob die Tabelle bereits vorhanden ist.Antworten:
Ich kann den Fehler nicht reproduzieren.
Vielleicht verstehe ich das Problem nicht.
Folgendes funktioniert in SQL Server 2005 einwandfrei, wobei die zusätzliche Spalte "foo" im zweiten Auswahlergebnis angezeigt wird:
quelle
'tempdb..#name'
ist genau das, was ich brauchte. Ich benutzte'dbo.#name'
, wie ein Dummkopf. Ich bekomme dastempdb
Teil, aber was ist mit den Doppelpunkten?Die Aussage sollte in der Reihenfolge sein
Ohne 'GO' dazwischen wird das Ganze als ein einziges Skript betrachtet, und wenn die select-Anweisung nach der Spalte sucht, wird sie nicht gefunden.
Bei 'GO' wird der Teil des Skripts bis zu 'GO' als ein einzelner Stapel betrachtet und ausgeführt, bevor nach 'GO' die Abfrage aufgerufen wird.
quelle
Anstatt
dropping
die temporäre Tabelle zu erstellen und neu zu erstellen, können Sie sietruncate
wiederverwendenWenn Sie die folgende Syntax verwenden
Sql Server 2016
oderAzure Sql Database
dann verwenden, um die temporäre Tabelle zu löschen und neu zu erstellen. Mehr Infos hier MSDNSyntax
Abfrage:
quelle
truncate/reuse
Methode effizienter wäre als dieDROP TABLE IF EXISTS
onSql Server 2016
undAzure Sql Database
auch. Ist das nicht der Fall?DROP TABLE IF Exists
SQL 2016 oder Azure vor? Die Syntax ist ab SQL 2008 verfügbar. Siehe MSDN-Link in Ihrer Antwort? Leistungsfaktor?DROP TABLE
dass SQL Server 2008 unterstützt wird, aber dieIF EXISTS
Klausel wurde 2016 eingeführt.INTO
: Wählen Sie * INTO #HistoricoUserTable von dbo.HistoricoUserIch denke, das Problem ist, dass Sie dazwischen eine GO-Anweisung hinzufügen müssen, um die Ausführung in Stapel zu unterteilen. Da das zweite Löschskript dh
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
die temporäre Tabelle nicht als Teil eines einzelnen Stapels gelöscht hat. Können Sie bitte das folgende Skript versuchen.quelle
tempdb..
im obigen Code ist sehr wichtig. Es muss vor dem Namen Ihrer temporären Tabelle stehen. Nur zu überprüfenOBJECT_ID('#Results')
ist nicht genug. Temporäre Tabellen werden in der TempDB-Datenbank gespeichert. Per Microsoft: Die TempDB-Systemdatenbank ist eine globale Ressource, die allen Benutzern zur Verfügung steht, die mit der Instanz von SQL Server verbunden oder mit der SQL-Datenbank verbunden sindtempdb
oder es wird nicht weg sein.Dies könnte mit einer einzigen Codezeile erreicht werden:
quelle
Dies funktionierte für mich: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
quelle
Nur ein kleiner Kommentar von meiner Seite, da das
OBJECT_ID
bei mir nicht funktioniert. Das wird immer zurückgegeben..even obwohl es tut exist. Ich habe gerade festgestellt, dass es unter einem anderen Namen gespeichert ist (durch
_
Unterstriche nachfixiert ), wie folgt :#tempTable________
Das funktioniert gut für mich:
quelle
Jetzt können Sie die folgende Syntax verwenden, wenn Sie eine der neuen Versionen von SQL Server (2016+) verwenden.
quelle
Incorrect syntax near the keyword 'IF'.
IF [NOT] EXISTS
Klausel ist in SQL Server 2016 verfügbar. Es spielt keine Rolle, welche SSMS-Version Sie verwenden.pmac72 verwendet GO, um die Abfrage in und verwendet ALTER.
Sie scheinen denselben Stapel auszuführen, führen ihn jedoch nach dem Ändern zweimal aus: DROP ... CREATE ... edit ... DROP ... CREATE ..
Schreiben Sie vielleicht Ihren genauen Code, damit wir sehen können, was los ist.
quelle
Normalerweise habe ich diesen Fehler festgestellt, wenn ich die temporäre Tabelle bereits erstellt habe. Der Code, der die SQL-Anweisung auf Fehler überprüft, erkennt die "alte" temporäre Tabelle und gibt eine Fehlzählung der Anzahl der Spalten in späteren Anweisungen zurück, als ob die temporäre Tabelle nie gelöscht worden wäre.
Nachdem Sie die Anzahl der Spalten in einer temporären Tabelle geändert haben, nachdem Sie bereits eine Version mit weniger Spalten erstellt haben, löschen Sie die Tabelle und führen Sie DANN Ihre Abfrage aus.
quelle
Ich habe kürzlich gesehen, wie ein DBA etwas Ähnliches getan hat:
quelle
Mein Code verwendet eine
Source
Tabelle, die sich ändert, und eineDestination
Tabelle, die diesen Änderungen entsprechen muss.quelle
Ja, "ungültige Spalte" Dieser Fehler wurde in der Zeile "Firma, Schritt-ID, Feld-ID, Neue Spalte aus #Ergebnissen auswählen" ausgelöst.
Es gibt zwei Phasen, in denen t-sql ausgeführt wird:
Beim Parsen überprüft der SQL Server in dieser Phase zunächst die Korrektur Ihrer übermittelten SQL-Zeichenfolge, einschließlich der Tabellenspalte, und optimiert Ihre Abfrage für die schnellste Wiedererlangung.
Zweitens: Ausführen und Abrufen der Daten.
Wenn die Tabelle #Results vorhanden ist, überprüft der Analyseprozess, ob die von Ihnen angegebenen Spalten gültig sind oder nicht. Andernfalls (Tabelle existiert nicht) wird beim Parsen die von Ihnen angegebenen Überprüfungsspalten übergeben.
quelle
Wenn Sie eine Spalte in einer temporären Tabelle ändern, müssen Sie die Tabelle löschen, bevor Sie die Abfrage erneut ausführen. (Ja, es ist ärgerlich. Genau das, was Sie tun müssen.)
Ich habe immer angenommen, dass dies daran liegt, dass die Prüfung "ungültige Spalte" vom Parser durchgeführt wird, bevor die Abfrage ausgeführt wird. Sie basiert also auf den Spalten in der Tabelle, bevor sie gelöscht wird ..... und das haben auch pnbs gesagt.
quelle