Không, trình phân tích cú pháp sẽ không cho phép bạn tạo cùng một bảng #temp hai lần trong cùng một đợt (và điều này không liên quan gì đến SSMS). Nó thậm chí không quan trọng nếu chỉ có một bản sao của bảng #temp có thể được tạo; ví dụ, trong logic có điều kiện sau đây, mà đối với con người rõ ràng chỉ có thể thực thi một nhánh, SQL Server không thể thấy rằng:
IF 1 = 1
BEGIN
CREATE TABLE #x(i INT);
DROP TABLE #x;
END
ELSE
BEGIN
CREATE TABLE #x(j INT);
DROP TABLE #x;
END
Msg 2714, Cấp 16, Trạng thái 1, Dòng 8
Đã có một đối tượng có tên '#x' trong cơ sở dữ liệu.
Và để chứng minh rằng SSMS không phàn nàn tại thời điểm biên dịch (một quan niệm sai lầm phổ biến):
DECLARE @sql NVARCHAR(MAX) = N'IF 1 = 1
BEGIN
CREATE TABLE #x(i INT);
DROP TABLE #x;
END
ELSE
BEGIN
CREATE TABLE #x(j INT);
DROP TABLE #x;
END';
EXEC sp_executesql @sql;
Mang lại cùng một lỗi chính xác, mặc dù SSMS không cố phân tích hoặc xác thực SQL động trước khi gửi nó đến máy chủ thông qua sp_executesql
.
Tất nhiên, cách khắc phục là sử dụng lại cùng một bảng #temp thay vì bỏ, sử dụng một bảng #temp khác nhau mỗi lần hoặc không sử dụng các bảng #temp ở vị trí đầu tiên.
Đây không phải là điều bạn nên mong đợi SQL Server sẽ xử lý tốt hơn. Nói cách khác, hãy làm quen với bất kỳ cách giải quyết nào mà bạn quyết định.
Xem thêm câu trả lời liên quan này trên Stack Overflow để đưa ra lời giải thích thay thế: