Nein, mit dem Parser können Sie nicht zweimal dieselbe # temp-Tabelle im selben Stapel erstellen (und dies hat nichts mit SSMS zu tun). Es spielt nicht einmal eine Rolle, ob jemals nur eine Kopie der # temp-Tabelle erstellt werden könnte. In der folgenden bedingten Logik, die für Menschen offensichtlich immer nur einen Zweig ausführen kann, kann SQL Server dies beispielsweise nicht erkennen:
IF 1 = 1
BEGIN
CREATE TABLE #x(i INT);
DROP TABLE #x;
END
ELSE
BEGIN
CREATE TABLE #x(j INT);
DROP TABLE #x;
END
Meldung 2714, Ebene 16,
Status 1, Zeile 8
In der Datenbank befindet sich bereits ein Objekt mit dem Namen '#x'.
Und um zu beweisen, dass sich SSMS beim Kompilieren nicht beschwert (ein häufiges Missverständnis):
DECLARE @sql NVARCHAR(MAX) = N'IF 1 = 1
BEGIN
CREATE TABLE #x(i INT);
DROP TABLE #x;
END
ELSE
BEGIN
CREATE TABLE #x(j INT);
DROP TABLE #x;
END';
EXEC sp_executesql @sql;
Gibt genau den gleichen Fehler aus, obwohl SSMS nicht versucht, dynamisches SQL zu analysieren oder zu validieren, bevor es über an den Server gesendet wird sp_executesql
.
Die Lösung besteht natürlich darin, dieselbe # temp-Tabelle erneut zu verwenden, anstatt sie zu löschen, jedes Mal eine andere # temp-Tabelle zu verwenden oder überhaupt keine # temp-Tabellen zu verwenden.
Dies ist nicht etwas, von dem Sie jemals erwarten sollten, dass SQL Server besser damit umgeht. Mit anderen Worten, gewöhnen Sie sich an die Problemumgehung, für die Sie sich entscheiden.
Siehe auch diese verwandte Antwort zum Stapelüberlauf, die eine alternative Erklärung gibt: