Tidak, pengurai tidak akan membiarkan Anda membuat tabel #temp yang sama dua kali dalam batch yang sama (dan ini tidak ada hubungannya dengan SSMS). Bahkan tidak masalah jika hanya satu salinan tabel #temp yang dapat dibuat; misalnya, dalam logika kondisional berikut, yang bagi manusia jelas hanya dapat menjalankan satu cabang, SQL Server tidak dapat melihat bahwa:
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, Level 16, Negara 1, Baris 8
Sudah ada objek bernama '#x' dalam database.
Dan untuk membuktikan itu bukan SSMS mengeluh pada waktu kompilasi (kesalahpahaman umum):
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;
Menghasilkan kesalahan yang sama persis, meskipun SSMS tidak mencoba menguraikan atau memvalidasi SQL dinamis sebelum mengirimnya ke server melalui sp_executesql
.
Cara mengatasinya, tentu saja, adalah menggunakan kembali tabel #temp yang sama dan bukannya menjatuhkan, menggunakan tabel #temp yang berbeda setiap kali, atau tidak menggunakan tabel #temp di tempat pertama.
Ini bukan sesuatu yang seharusnya Anda harapkan SQL Server untuk menangani lebih baik. Dengan kata lain, biasakan diri untuk penyelesaian apa pun yang Anda putuskan.
Lihat juga jawaban terkait ini di Stack Overflow yang memberikan penjelasan alternatif: