Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

T-Sql sembra valutare l'istruzione If anche quando la condizione non è vera

SQL Server analizza l'istruzione e la convalida, ignorando eventuali condizionali. Questo è il motivo per cui fallisce anche quanto segue:

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

Sia che premi Esegui o solo Analizza, questo si traduce in:

SQL Server non sa o non si preoccupa di quale ramo di un condizionale verrà inserito; convalida comunque tutte le istruzioni in un batch. Puoi fare cose come (a causa della risoluzione dei nomi differita):

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

Ma non puoi farlo:

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

La soluzione alternativa, in genere, consiste nell'utilizzare SQL dinamico:

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