SQL Server analizza l'istruzione e la convalida, ignorando eventuali condizionali. Questo è il motivo per cui fallisce anche quanto segue:
IF 1 = 1
BEGIN
CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
CREATE TABLE #foo(id INT);
END
Sia che premi Esegui o solo Analizza, questo si traduce in:
SQL Server non sa o non si preoccupa di quale ramo di un condizionale verrà inserito; convalida comunque tutte le istruzioni in un batch. Puoi fare cose come (a causa della risoluzione dei nomi differita):
IF <something>
BEGIN
SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END
Ma non puoi farlo:
IF <something>
BEGIN
SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END
La soluzione alternativa, in genere, consiste nell'utilizzare SQL dinamico:
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