Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

T-Sql scheint die If-Anweisung auszuwerten, selbst wenn die Bedingung nicht wahr ist

SQL Server analysiert die Anweisung und validiert sie, wobei alle if-Bedingungen ignoriert werden. Deshalb schlägt auch Folgendes fehl:

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

Unabhängig davon, ob Sie auf Ausführen oder nur auf Analysieren klicken, ergibt dies:

SQL Server weiß nicht, welcher Zweig einer Bedingung eingegeben wird, oder kümmert sich nicht darum; es validiert sowieso alle Anweisungen in einem Stapel. Sie können Dinge tun wie (aufgrund der verzögerten Namensauflösung):

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

Aber Sie können nicht:

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

Die Problemumgehung besteht normalerweise darin, dynamisches SQL zu verwenden:

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