sql >> Base de Datos >  >> RDS >> Sqlserver

T-Sql parece estar evaluando la declaración If incluso cuando la condición no es verdadera

SQL Server analiza la declaración y la valida, ignorando cualquier condición condicional. Por eso también falla lo siguiente:

IF 1 = 1
BEGIN
  CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
  CREATE TABLE #foo(id INT);
END

Ya sea que presione Ejecutar o simplemente Analizar, esto da como resultado:

SQL Server no sabe ni le importa qué rama de un condicional se ingresará; valida todas las declaraciones en un lote de todos modos. Puede hacer cosas como (debido a la resolución de nombres diferida):

IF <something>
BEGIN
  SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END

Pero no puedes hacer:

IF <something>
BEGIN
  SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END

La solución, por lo general, es usar SQL dinámico:

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