Tijdelijke tabel in SQL-server die de fout ‘Er is al een object met de naam’ veroorzaakt

Ik heb het volgende probleem in SQL Server, ik heb een code die er als volgt uitziet:

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  
SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN  FROM TBL_PEOPLE

Als ik dit doe, krijg ik de foutmelding ‘Er is al een object met de naam ‘#TMPGUARDIAN’ in de database’. Kan iemand mij vertellen waarom ik deze foutmelding krijg?


Antwoord 1, autoriteit 100%

Je laat het vallen, maakt het dan aan en probeert het dan opnieuw te maken door SELECT INTOte gebruiken. Wijzig in:

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 kunt u een tabel maken zonder een CREATE TABLE-instructie met behulp van SELECT INTO


Antwoord 2, autoriteit 49%

Ik plaats deze regels meestal aan het begin van mijn opgeslagen procedure en dan aan het einde.

Het is een “bestaat”-controle voor #temp-tabellen.

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

Volledig voorbeeld:

CREATE PROCEDURE [dbo].[uspTempTableSuperSafeExample]
AS
BEGIN
    SET NOCOUNT ON;
    IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
    BEGIN
            DROP TABLE #MyCoolTempTable
    END
    CREATE TABLE #MyCoolTempTable (
        MyCoolTempTableKey INT IDENTITY(1,1),
        MyValue VARCHAR(128)
    )  
    INSERT INTO #MyCoolTempTable (MyValue)
        SELECT LEFT(@@VERSION, 128)
        UNION ALL SELECT TOP 10 LEFT(name, 128) from sysobjects
    SELECT MyCoolTempTableKey, MyValue FROM #MyCoolTempTable
    IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
    BEGIN
            DROP TABLE #MyCoolTempTable
    END
    SET NOCOUNT OFF;
END
GO

Antwoord 3, autoriteit 10%

U moet de zoekopdracht als volgt aanpassen

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

— Maak een laatste sessie om alle tijdelijke tabellen te wissen. vallen altijd op het einde. In uw geval kan er soms een fout optreden als de tabel niet bestaat, terwijl u probeert te verwijderen.

DROP TABLE #TMPGUARDIAN

Vermijd het gebruik van invoegen in
Omdat als u in de toekomst invoegt in als u de tijdelijke tabel wilt wijzigen door een nieuwe kolom toe te voegen die na een proces kan worden gevuld (niet samen met invoegen). Op dat moment moet je het op dezelfde manier opnieuw bewerken en ontwerpen.

Gebruik tabelvariabele http://odetocode.com/articles/365.aspx

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

Voordelen
Drop-instructies zijn niet nodig, omdat dit vergelijkbaar is met variabelen. Scope eindigt onmiddellijk na de uitvoering.


Antwoord 4, autoriteit 2%

Soms maak je domme fouten, zoals het schrijven van een invoegquery in hetzelfde .sql-bestand (in dezelfde werkruimte/tabblad), dus zodra je de invoegquery uitvoert waar je query voor maken net hierboven is geschreven en al is uitgevoerd, zal het opnieuw start de uitvoering samen met de invoegquery.

Dit is de reden waarom we krijgen dat de objectnaam (tabelnaam) al bestaat, omdat deze voor de tweede keer wordt uitgevoerd.

Ga dus naar een apart tabblad om de insert of drop te schrijven of welke query dan ook die u gaat uitvoeren.

Of gebruik anders commentaarregels voorafgaand aan alle zoekopdrachten in dezelfde werkruimte, zoals

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

Antwoord 5

In Azure Data Warehouse komt dit ook wel eens voor, omdat tijdelijke tabellen zijn gemaakt voor een gebruikerssessie.. Ik heb hetzelfde probleem opgelost door de database opnieuw te verbinden,

Other episodes