Des erreurs SQL Server 2005
-
09-06-2019 - |
Question
Pourquoi ne pouvez-vous pas faire cela et il y a contourner?
Vous obtenez cette erreur.
Msg 2714, Niveau 16, État 1, Ligne 13 Il y a déjà un objet nommé "#temptable " dans la base de données.
declare @x int
set @x = 1
if (@x = 0)
begin
select 1 as Value into #temptable
end
else
begin
select 2 as Value into #temptable
end
select * from #temptable
drop table #temptable
La solution
C'est une question en deux parties et tout Kev Fairchild fournit une bonne réponse à la deuxième question, il ignore totalement la première pourquoi l'erreur est-elle produite?
La réponse réside dans la façon dont le préprocesseur œuvres.Cette
SELECT field-list INTO #symbol ...
est résolu en un parse-arbre qui est directement équivalent à
DECLARE #symbol_sessionid TABLE(field-list)
INSERT INTO #symbol_sessionid SELECT field-list ...
ce qui met un symbole " # " dans le champ nom de la table.L'entreprise, avec _sessionid est de fournir à chaque session d'utilisateur avec un espace de noms privé;si vous spécifiez deux hash (#symbole#) ce comportement est supprimée.Munging et unmunging de la sessionid extension est (ovbiously) transparent.
Le résultat de tout cela est que plusieurs EN symbole #clauses de produire de multiples déclarations dans le même champ d'application, conduisant à des Msg 2714.
Autres conseils
Vous ne pouvez pas le faire à cause de la résolution de nom différée, vous pouvez le faire avec une vraie table, il suffit de prendre le livre des signes
Vous pouvez également créer la table temp d'abord en haut, puis faire régulièrement insérer dans la table
Première étape...vérifier si la table existe déjà...si elle le fait, de le supprimer.Ensuite, créer explicitement sur la table, plutôt que d'utiliser l'instruction SELECT INTO...
Vous constaterez qu'il est beaucoup plus fiable de cette façon.
IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL
BEGIN
DROP TABLE #temptable
END
CREATE TABLE #temptable (Value INT)
declare @x int
set @x = 1
if (@x = 0)
begin
INSERT INTO #temptable (Value) select 1
end
else
begin
INSERT INTO #temptable (Value) select 2
end
select * from #temptable
drop table #temptable
Aussi, espérons-le, la table et les noms de champ sont simplifiées pour votre exemple et ne sont pas ce que vous vraiment de les appeler ;)
-- Kevin Fairchild
Différé de résolution de nom est aussi la raison pour laquelle vous ne pouvez pas être sûr que sp_depends donne des résultats corrects, découvrez ce post, j'ai écrit tout à l'arrière Avez-vous dépendent sp_depends (no pun intended)
Je vais deviner le problème, c'est que vous n'avez pas créé le #temptable.
Désolé je ne peux pas être plus détaillé, mais puisque vous n'avez même pas essayé d'expliquer ce que vous voyez, vous obtenez un moins que stellaire réponse.
Dans le regard de la code semble que vous pourriez avoir été prototypage dans SQL Studio ou similaire, à droite?Puis-je suppose que vous avez lancé il y a quelques temps et qu'il avait en arriver au point où il est créé #temptable mais ensuite échoué avant d'en arriver à la fin et a chuté de nouveau la table?Redémarrez SQL outil d'édition que vous utilisez et essayez à nouveau.