SQL Server analyserar satsen och validerar den, och ignorerar eventuella if-villkor. Det är därför följande också misslyckas:
IF 1 = 1
BEGIN
CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
CREATE TABLE #foo(id INT);
END
Oavsett om du trycker på Execute eller bara Parse, resulterar detta i:
SQL Server vet inte eller bryr sig inte om vilken gren av en villkorlig som kommer att anges; det validerar alla påståenden i en batch ändå. Du kan göra saker som (på grund av uppskjuten namnupplösning):
IF <something>
BEGIN
SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END
Men du kan inte göra:
IF <something>
BEGIN
SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END
Lösningen är vanligtvis att använda dynamisk 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