Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

T-Sql semble évaluer l'instruction If même lorsque la condition n'est pas vraie

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