sql >> Databáze >  >> RDS >> Sqlserver

Zdá se, že T-Sql vyhodnocuje příkaz If, i když podmínka není pravdivá

SQL Server analyzuje příkaz a ověřuje jej, přičemž ignoruje všechny podmínky if. To je důvod, proč se nezdaří ani následující:

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

Ať už stisknete Execute nebo jen Parse, výsledkem je:

SQL Server neví nebo se nestará o to, která větev podmínky bude zadána; stejně ověří všechny příkazy v dávce. Můžete dělat věci jako (kvůli odloženému rozlišení názvů):

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

Ale nemůžete:

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

Řešením je obvykle použití dynamického SQL:

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


  1. Vytvořte dočasnou tabulku založenou na jiné tabulce na serveru SQL Server

  2. Mohu použít neagregované sloupce se skupinou podle?

  3. Jak pgBouncer pomáhá urychlit Django

  4. Jak získám první datum čtvrtletí v MySQL?