web-dev-qa-db-fra.com

Table temporaire dans le serveur SQL provoquant l'erreur "Il existe déjà un objet nommé"

J'ai le problème suivant dans SQL Server, j'ai du code qui ressemble à ceci:

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

SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN  FROM TBL_PEOPLE

Lorsque je fais cela, j'obtiens une erreur "Il existe déjà un objet nommé" #TMPGUARDIAN "dans la base de données". Quelqu'un peut-il me dire pourquoi je reçois cette erreur?

37
Art F

Vous le déposez, puis le créez, puis essayez de le créer à nouveau à l'aide de SELECT INTO. Changer en:

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

Dans MS SQL Server, vous pouvez créer une table sans instruction CREATE TABLE à l'aide de SELECT INTO.

59
Hart CO

Je mets généralement ces lignes au début de ma procédure stockée, puis à la fin.

C'est un contrôle "existe" pour les tables #temp.

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

Vous devez modifier la requête comme ceci

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

- Faites une dernière session pour effacer toutes les tables temporaires. toujours tomber à la fin. Dans votre cas, parfois, une erreur peut survenir si la table n’existe pas, alors que vous essayez de la supprimer.

DROP TABLE #TMPGUARDIAN

Évitez d'utiliser insert dans Parce que si vous utilisez insert into, vous pourrez à l'avenir modifier le tableau temporaire en ajoutant une nouvelle colonne pouvant être remplie après un processus (pas avec insert). À ce moment-là, vous devez le retravailler et le concevoir de la même manière.

Utiliser la variable de table http://odetocode.com/articles/365.aspx

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

Avantages Pas besoin d'instructions Drop, car elles seront similaires aux variables. La portée se termine immédiatement après l'exécution.

5
kbvishnu

Parfois, vous pouvez faire des erreurs stupides comme écrire une requête d'insertion sur le même fichier .sql (dans le même espace de travail/onglet) afin qu'une fois que vous exécutez la requête d'insertion où votre requête de création a été écrite juste au-dessus et déjà exécutée, elle recommencera à s'exécuter avec la requête d'insertion.

C'est la raison pour laquelle nous obtenons que le nom de l'objet (nom de la table) existe déjà, car il est exécuté pour la deuxième fois.

Alors, allez dans un onglet séparé pour écrire l'insertion ou la suppression, ou toute autre requête que vous êtes sur le point d'exécuter.

Sinon, utilisez les lignes de commentaire précédant toutes les requêtes dans le même espace de travail, comme

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

Cela se produit parfois aussi dans Azure Data Warehouse, car des tables temporaires ont été créées pour une session utilisateur. Le même problème a été résolu en reconnectant la base de données, 

0
dgcharitha