Kết hợp một công cụ quickie để giúp gỡ lỗi, tôi gặp phải một lỗi dường như là một lỗi trong trình biên dịch.
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;
Cố gắng ở trên trả về lỗi sau
Msg 2714, Cấp 16, Trạng thái 1, Thủ tục spFoo, Dòng 19
Đã có một đối tượng có tên '#bar' trong cơ sở dữ liệu.
Theo nghĩa có thể đọc được của con người, Proc dường như vẫn ổn: chỉ có một select into
câu lệnh sẽ được thực thi kể từ khi chúng được bọc bên trong các if-else
khối. Mặc dù vậy, máy chủ SQL không thể xác nhận rằng các câu lệnh được loại trừ một cách hợp lý với nhau. Có lẽ khó hiểu hơn là lỗi vẫn còn khi drop table #foo
được đặt bên trong khối if-other (mà người ta giả định sẽ báo cho trình biên dịch phân bổ tên đối tượng) như bên dưới.
create proc spFoo
@param bit
as
begin
select top 1 *
into #bar
from [master].dbo.spt_values
if @param = 0
begin
drop table #bar;
select *
into #bar
from [master].dbo.spt_values
-- where number between ...
end
else
begin
drop table #bar;
select top 10 *
into #bar
from [master].dbo.spt_values
order by newid();
end;
end;
Bản thân Proc cũng ổn. Tôi mút nó và viết create table #foo( ... )
và insert #foo ( ... )
phát biểu, tôi đã cố gắng bỏ qua với select * into
cú pháp. Tại thời điểm này, tôi chỉ đang cố gắng để hiểu lý do tại sao trình biên dịch xuất hiện trong tôi với cú pháp của kẻ lười biếng. Điều duy nhất tôi có thể nghĩ là lệnh DDL bảo lưu tên đối tượng IN TEMPDB .
Tại sao chữ đậm?
create proc spIck
as
begin
create table #ack ( col1 int );
drop table #ack;
create table #ack ( colA char( 1 ) );
drop table #ack;
end;
Điều này không thành công với mã lỗi như trên. Nhưng sau đây ...
create proc spIck
as
begin
create table ack ( col1 int );
drop table ack;
create table ack ( colA char( 1 ) );
drop table ack;
end;
... Thành công. Điều tương tự như sau ở trên với nỗ lực ban đầu. Vì thế...
Câu hỏi của tôi là đây
Sự khác biệt (và tại sao nó hiện diện) trong bảo lưu tên đối tượng cho TempDB
các đối tượng trái ngược với cơ sở dữ liệu người dùng. Không có tài liệu tham khảo Xử lý truy vấn logic hay tham chiếu lệnh DDL nào tôi đã xem xét xuất hiện để giải thích điều này.