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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top