MSSQL 中带 drop table 的双循环
Double loop with drop table in MSSQL
我在 while 循环中设置了 while 循环,两个循环都对一个 table 进行了一些修改。我收到 table 已经存在的错误。下面是这个问题的简单示例。有人可以澄清为什么这不起作用吗?我知道如何在这种特殊情况下绕过这个问题,不过我想知道它是从哪里来的。
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
正如 Sean Lange 所指出的,您可以在没有循环的情况下做任何您正在做的事情。
同一过程中不能有两个语句创建同名的临时文件 table。
这是 SQL 6.5 的遗留物,它没有延迟名称解析。
不使用 select into
,而是使用 create table + insert
。
不要删除并重新创建具有相同架构的相同 table,而是使用 truncate table
。
Answer by Erland Sommarskog on 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;
我在 while 循环中设置了 while 循环,两个循环都对一个 table 进行了一些修改。我收到 table 已经存在的错误。下面是这个问题的简单示例。有人可以澄清为什么这不起作用吗?我知道如何在这种特殊情况下绕过这个问题,不过我想知道它是从哪里来的。
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
正如 Sean Lange 所指出的,您可以在没有循环的情况下做任何您正在做的事情。
同一过程中不能有两个语句创建同名的临时文件 table。 这是 SQL 6.5 的遗留物,它没有延迟名称解析。
不使用 select into
,而是使用 create table + insert
。
不要删除并重新创建具有相同架构的相同 table,而是使用 truncate table
。
Answer by Erland Sommarskog on 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;