Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

T-Sql dường như đang đánh giá câu lệnh If ngay cả khi điều kiện không đúng

SQL Server phân tích cú pháp câu lệnh và xác thực nó, bỏ qua bất kỳ điều kiện if nào. Đây là lý do tại sao những điều sau cũng không thành công:

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

Cho dù bạn nhấn Thực thi hay chỉ Phân tích cú pháp, điều này dẫn đến:

SQL Server không biết hoặc không quan tâm đến nhánh nào của một điều kiện sẽ được nhập; nó vẫn xác thực tất cả các câu lệnh trong một lô. Bạn có thể làm những việc như (do giải quyết tên bị hoãn lại):

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

Nhưng bạn không thể làm:

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

Cách giải quyết thường là sử dụng SQL động:

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. Tên cột máy chủ SQL không hợp lệ sau khi thêm cột mới

  2. Làm thế nào để thực thi một gói SSIS từ .NET?

  3. Các phương pháp miễn phí để sửa chữa lỗi chỉ mục máy chủ SQL

  4. Phân biệt theo ngày đặt hàng và sản phẩm SQL Server 2008

  5. Cách thêm Ràng buộc khóa ngoại vào bảng hiện có trong SQL Server - Hướng dẫn SQL Server / TSQL Phần 68