SQL Server parseert de instructie en valideert deze, waarbij eventuele if-voorwaarden worden genegeerd. Daarom faalt het volgende ook:
IF 1 = 1
BEGIN
CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
CREATE TABLE #foo(id INT);
END
Of je nu op Uitvoeren drukt of gewoon op Parseren, dit resulteert in:
SQL Server weet niet of het kan schelen welke tak van een voorwaardelijke wordt ingevoerd; het valideert hoe dan ook alle verklaringen in een batch. U kunt dingen doen als (vanwege uitgestelde naamresolutie):
IF <something>
BEGIN
SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END
Maar je kunt niet doen:
IF <something>
BEGIN
SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END
De tijdelijke oplossing is meestal om dynamische SQL te gebruiken:
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