SQL Server analyse l'instruction et la valide, en ignorant toutes les conditions conditionnelles. C'est pourquoi ce qui suit échoue également :
IF 1 = 1
BEGIN
CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
CREATE TABLE #foo(id INT);
END
Que vous appuyiez sur Exécuter ou simplement sur Analyser, cela se traduit par :
SQL Server ne sait pas ou ne se soucie pas de la branche d'une condition qui sera saisie ; il valide de toute façon toutes les instructions d'un lot. Vous pouvez faire des choses comme (en raison de la résolution de nom différée) :
IF <something>
BEGIN
SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END
Mais vous ne pouvez pas :
IF <something>
BEGIN
SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END
La solution consiste généralement à utiliser SQL dynamique :
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