SQL Server, ne peut pas vérifier si #de la table temporaire, si else
Je suis de la création d'un Déclencheur qui gère une table temporaire (#attributeType). Depuis le déclencheur peut être appelé plus d'une fois, je voulais être sûr et vérifier si la table temporaire #attributeType est toujours là.
C'est mon code dans le déclencheur corps qui vérifie la table temp:
IF OBJECT_ID('tempdb..#attributeType') IS NOT NULL
BEGIN
DROP TABLE #attributeType
SELECT * INTO #attributeType
FROM attributeType
PRINT 'IN IF'+ CAST(OBJECT_ID('tempdb..#attributeType') AS NVARCHAR(80))
END
ELSE
BEGIN
SELECT * INTO #attributeType
FROM attributeType
PRINT 'IN ELSE'+ CAST(OBJECT_ID('tempdb..#attributeType') AS NVARCHAR(80))
END
Quand j'ai tester le code en le sélectionnant avec la touche F5 je reçois ce message d'erreur indiquant que le #attributeType de la table temporaire existent:
Msg 2714, Level 16, State 1, Line 11
There is already an object named '#attributeType' in the database.
Je sais que dans les procédures stockées de la #tempTables sera supprimé dès que la sp se termine, mais je ne peux pas comprendre pourquoi mon code est faux?
N. B.
Quand je commenter le bloc AUTRE que le code fonctionne.
OriginalL'auteur Luther | 2014-08-30
Vous devez vous connecter pour publier un commentaire.
Votre test sur
OBJECT_ID('tempdb..#attributeType')
fonctionne très bien. Vous pouvez le tester en exécutant séparément, sansdrop
etcreate
dans le même lot.Le problème est que SQL Server traite l'ensemble du lot avant de l'exécuter. Si elle sait que
#attributeType
existe, il donnera une erreur:Même si vous supprimez la table dans la rangée précédente.
La seule solution est de supprimer la table dans un lot différent:
Une autre solution est de créer un tableau dans un autre champ:
Pas un bug, juste un degré de primitivité
En plaçant un ALLER dans le corps d'un Déclencheur, les variables déclarées avant la déclaration ne sont pas visible dans le nouveau lot. Suppose que je vais avoir à traiter avec cette certaine façon. Placer Si la clause comme la première déclaration, suivie par ALLER à la détente du corps et de déclarer toutes les variables et tous le reste du code ne sera pas divisé sur la gâchette en 2 lots et de les faire échouer?
Je ne pense pas que vous pouvez utiliser
go
dans un trigger-la partie inférieure serait juste de tomber de la définition du déclencheur. Serait une variable de table commedeclare @tmp table (id int identity, col1 varchar(50))
convenir à votre but?ALLER ne peut pas être placé dans le corps d'un déclencheur, car il n'est pas une instruction T-SQL; ALLER un lot de terminaison reconnu par les outils clients SQL Server, et ne sont jamais passés à SQL Server. Je ne suis pas sûr de savoir pourquoi vous avez 2 différents SELECT...INTO mais qui va être problématique.
OriginalL'auteur Andomar
Si vous n'avez pas besoin d'effectuer d'autres opérations dans le IF..ELSE, votre code peut être simplifié à l'suivantes:
Dans ce cas, vous évitez les
There is already an object named...
erreur et vous avez encore de la table temporaire.OriginalL'auteur Sebastian Budka