Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

T-Sql tampaknya mengevaluasi pernyataan If bahkan ketika kondisinya tidak benar

SQL Server mem-parsing pernyataan dan memvalidasinya, mengabaikan persyaratan if apa pun. Inilah sebabnya mengapa yang berikut ini juga gagal:

IF 1 = 1
BEGIN
  CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
  CREATE TABLE #foo(id INT);
END

Apakah Anda menekan Execute atau hanya Parse, ini menghasilkan:

SQL Server tidak tahu atau peduli cabang kondisional mana yang akan dimasukkan; itu memvalidasi semua pernyataan dalam satu batch. Anda dapat melakukan hal-hal seperti (karena resolusi nama yang ditangguhkan):

IF <something>
BEGIN
  SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END

Tapi kamu tidak bisa:

IF <something>
BEGIN
  SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END

Solusinya, biasanya, adalah dengan menggunakan SQL dinamis:

IF <something>
BEGIN
  DECLARE @sql NVARCHAR(MAX);
  SET @sql = N'SELECT column_that_does_not_exist FROM dbo.Table_That_Does;';
  EXEC sp_executesql @sql;
END


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menggunakan JOIN alih-alih UNION untuk menghitung tetangga A OR B?

  2. SQL menghitung baris dalam tabel

  3. Paket SSIS gagal dengan kesalahan Jika driver 64-bit tidak diinstal, jalankan dalam mode 32-bit

  4. Pengumpulan Data Otomatis tentang Tugas yang Selesai di MS SQL Server

  5. 3 Cara untuk Mengetahui apakah Kolom adalah Kolom yang Dihitung di SQL Server