it-swarm.com.de

Temporäre Tabelle im SQL-Server, die den Fehler 'Es gibt bereits ein Objekt namens' verursacht

Ich habe das folgende Problem in SQL Server, ich habe Code, der wie folgt aussieht:

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN  FROM TBL_PEOPLE

Wenn ich dies tue, erhalte ich die Fehlermeldung 'Es gibt bereits ein Objekt mit dem Namen' #TMPGUARDIAN 'in der Datenbank'. Kann mir jemand sagen, warum ich diesen Fehler bekomme?

37
Art F

Sie legen es ab, erstellen es und versuchen dann, es mit SELECT INTO erneut zu erstellen. Ändern:

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

INSERT INTO #TMPGUARDIAN 
SELECT LAST_NAME,FRST_NAME  
FROM TBL_PEOPLE

In MS SQL Server können Sie eine Tabelle ohne eine CREATE TABLE-Anweisung erstellen, indem Sie SELECT INTO verwenden.

59
Hart CO

Normalerweise setze ich diese Zeilen am Anfang meiner gespeicherten Prozedur und dann am Ende.

Es ist eine Prüfung auf Vorhandensein von #temp-Tabellen.

IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
begin
        drop table #MyCoolTempTable
end
29
granadaCoder

Sie müssen die Abfrage so ändern

CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

INSERT INTO #TMPGUARDIAN(FRST_NAME,LAST_NAME)
SELECT LAST_NAME,FRST_NAME  FROM TBL_PEOPLE

- Machen Sie eine letzte Sitzung zum Löschen aller temporären Tabellen. Immer am Ende fallen. In Ihrem Fall kann manchmal ein Fehler auftreten, wenn die Tabelle nicht vorhanden ist, während Sie versuchen, zu löschen.

DROP TABLE #TMPGUARDIAN

Vermeiden Sie die Verwendung von Einfügungen in Weil Wenn Sie Einfügen in verwenden, wenn Sie die temporäre Tabelle ändern möchten, indem Sie eine neue Spalte hinzufügen, die nach einem bestimmten Prozess gefüllt werden kann (nicht zusammen mit der Einfügung). Zu diesem Zeitpunkt müssen Sie es auf die gleiche Weise überarbeiten und entwerfen.

Tabellenvariable verwenden http://odetocode.com/articles/365.aspx

declare @userData TABLE(
 LAST_NAME NVARCHAR(30),
    FRST_NAME NVARCHAR(30)
)

Advantages Keine Drop-Anweisungen erforderlich, da dies Variablen ähnelt. Der Umfang endet unmittelbar nach der Ausführung.

5
kbvishnu

Manchmal können Sie dumme Fehler machen, z. B. das Schreiben einer Einfüge-Abfrage in derselben .sql-Datei (im selben Arbeitsbereich/auf derselben Registerkarte). Wenn Sie also die Einfüge-Abfrage ausführen, in der Ihre Erstellungsabfrage oben geschrieben wurde und bereits ausgeführt wurde, wird sie erneut ausgeführt mit der Einfügeabfrage.

Dies ist der Grund, warum der Objektname (Tabellenname) bereits existiert, da er zum zweiten Mal ausgeführt wird.

Wechseln Sie also zu einer separaten Registerkarte, um die Einfügung oder Ablage oder alle anderen Abfragen zu schreiben, die Sie ausführen möchten.

Oder verwenden Sie Kommentarzeilen vor allen Abfragen im gleichen Arbeitsbereich wie

CREATE -- …
-- Insert query
INSERT INTO -- …

In Azure Data Warehouse tritt dies auch gelegentlich auf, da für eine Benutzersitzung temporäre Tabellen erstellt wurden. Das gleiche Problem wurde durch erneutes Verbinden der Datenbank behoben. 

0
dgcharitha