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