Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O T-Sql parece estar avaliando a instrução If mesmo quando a condição não é verdadeira


O SQL Server analisa a instrução e a valida, ignorando quaisquer condicionais if. É por isso que o seguinte também falha:
IF 1 = 1
BEGIN
  CREATE TABLE #foo(id INT);
END
ELSE
BEGIN
  CREATE TABLE #foo(id INT);
END

Se você pressionar Executar ou apenas Analisar, isso resultará em:

O SQL Server não sabe nem se importa com qual branch de uma condicional será inserida; ele valida todas as instruções em um lote de qualquer maneira. Você pode fazer coisas como (devido à resolução de nomes adiada):
IF <something>
BEGIN
  SELECT foo FROM dbo.Table_That_Does_Not_Exist;
END

Mas você não pode fazer:
IF <something>
BEGIN
  SELECT column_that_does_not_exist FROM dbo.Table_That_Does;
END

A solução alternativa, normalmente, é 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