SQL Server analizuje instrukcję i weryfikuje ją, ignorując wszelkie warunki warunkowe. Z tego powodu zawodzą również następujące elementy:
IF 1 = 1
BEGIN
CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
CREATE TABLE #foo(id INT);
END
Niezależnie od tego, czy klikniesz Execute, czy tylko Parse, spowoduje to:
SQL Server nie wie ani nie dba o to, która gałąź warunku zostanie wprowadzona; mimo to sprawdza poprawność wszystkich instrukcji w partii. Możesz robić takie rzeczy jak (ze względu na odroczone rozpoznawanie nazw):
IF <something>
BEGIN
SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END
Ale nie możesz zrobić:
IF <something>
BEGIN
SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END
Obejściem tego problemu jest zazwyczaj użycie dynamicznego 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