Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

T-Sql изглежда оценява оператора If дори когато условието не е вярно

SQL Server анализира оператора и го валидира, като игнорира всякакви условни оператори. Ето защо следното също е неуспешно:

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

Независимо дали натиснете Execute или просто Parse, това води до:

SQL Server не знае и не се интересува кой клон на условно условие ще бъде въведен; така или иначе валидира всички изрази в пакет. Можете да правите неща като (поради отложено разрешаване на имена):

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

Но не можете да направите:

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

Заобиколното решение обикновено е да се използва динамичен SQL:

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. Как да комбинирате резултатите от две заявки в един набор от данни

  2. Агрегатът може да не се появи в списъка с набори на оператор UPDATE

  3. Не може да се зареди насипно. Код за грешка в операционната система 5 (Достъпът е отказан.)

  4. CTE за получаване на дати между две дати с помощта на SQL Server

  5. Как да промените стойностите за редактиране на най-горния X и избор на най-горните X редове в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 20