相关疑难解决方法(0)

SELECT INTO 是否在运行时之前在 TempDB 中保留 #Object 名称?

将一个 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)

sql-server ddl tempdb temporary-tables

8
推荐指数
1
解决办法
511
查看次数

标签 统计

ddl ×1

sql-server ×1

tempdb ×1

temporary-tables ×1