J'ai tout en boucle à l'intérieur tandis que la boucle et les deux loops font quelques modifications d'une table. Je reçois une erreur que la table existe déjà. Ci-dessous un exemple simple de ce problème. Quelqu'un pourrait-il clarifier pourquoi cela ne fonctionne pas? Je sais comment contourner ce problème dans ce cas particulier, néanless je voudrais comprendre d'où cela vient-il.
CREATE TABLE #a( ID int) DECLARE @i INT DECLARE @j INT SET @i = 1 SET @j = 1 WHILE @i < 10 BEGIN SELECT * INTO #b FROM #a DROP TABLE #b WHILE @j < 10 BEGIN SELECT * INTO #b FROM #a DROP TABLE #b SET @j = @j + 1 END SET @i = @i + 1 END
Comme l'a souligné Sean Lange, vous pouvez probablement faire tout ce que vous faites sans loops.
Vous ne pouvez pas avoir deux instructions dans la même procédure qui créent une table temporaire avec le même nom. Ceci est un rest de SQL 6.5 qui n'a pas de résolution de nom différée.
Au lieu d'utiliser select into
, utilisez create table + insert
.
Au lieu de supprimer et recréer la même table avec le même schéma, utilisez truncate table
.
Réponse de Erland Sommarskog sur MSDN Social
create table #a(ID int); create table #b(ID int); declare @i int; declare @j int; set @i = 1; set @j = 1; while @i < 10 begin; insert into #b (id) select id from #a; truncate table #b; while @j < 10 begin; insert into #b (id) select id from #a truncate table #b; set @j = @j + 1; end; set @i = @i + 1; end;