将一个 quickie proc 放在一起以帮助调试,我遇到了一个似乎是编译器错误的地方。
create proc spFoo
@param bit
as
begin
if @param = 0
begin
select *
into #bar
from [master].dbo.spt_values
-- where number between ...
end
else
begin
select top 10 *
into #bar
from [master].dbo.spt_values
order by newid();
end;
end;
Run Code Online (Sandbox Code Playgroud)
尝试上述返回以下错误
消息 2714,级别 16,状态 1,过程 spFoo,第 19 行
数据库中已经有一个名为“#bar”的对象。
在人类可读的意义上,proc 似乎很好:select into由于它们被包裹在if-else块中,因此只会执行一个语句。不过很好,SQL Server 无法确认这些语句在逻辑上是否相互排斥。也许更令人困惑的是,当将drop table #foo放在 if-else 块中时错误仍然存在(假设它会告诉编译器取消分配对象名称),如下所示。
create proc spFoo
@param bit
as
begin
select top 1 *
into #bar …Run Code Online (Sandbox Code Playgroud)