SQL Server analiza la declaración y la valida, ignorando cualquier condición condicional. Por eso también falla lo siguiente:
IF 1 = 1
BEGIN
CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
CREATE TABLE #foo(id INT);
END
Ya sea que presione Ejecutar o simplemente Analizar, esto da como resultado:
SQL Server no sabe ni le importa qué rama de un condicional se ingresará; valida todas las declaraciones en un lote de todos modos. Puede hacer cosas como (debido a la resolución de nombres diferida):
IF <something>
BEGIN
SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END
Pero no puedes hacer:
IF <something>
BEGIN
SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END
La solución, por lo general, es usar SQL dinámico:
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