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 INTO
te 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,