Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wygląda na to, że T-Sql ocenia instrukcję If, nawet jeśli warunek nie jest spełniony

SQL Server analizuje instrukcję i weryfikuje ją, ignorując wszelkie warunki warunkowe. Z tego powodu zawodzą również następujące elementy:

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

Niezależnie od tego, czy klikniesz Execute, czy tylko Parse, spowoduje to:

SQL Server nie wie ani nie dba o to, która gałąź warunku zostanie wprowadzona; mimo to sprawdza poprawność wszystkich instrukcji w partii. Możesz robić takie rzeczy jak (ze względu na odroczone rozpoznawanie nazw):

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

Ale nie możesz zrobić:

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

Obejściem tego problemu jest zazwyczaj użycie dynamicznego 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL — Jak uzyskać tylko liczby po przecinku?

  2. Jaki jest najlepszy sposób na tworzenie stronicowania w SQL Server?

  3. sql jak zapytanie wolno, jeśli używasz parametru deklaracji, ale szybko, jeśli nie

  4. Korzystanie z wygenerowanego przez bazę danych GUID i datetime z EF4

  5. Jak zwrócić wszystkie niezaufane ograniczenia kluczy obcych w programie SQL Server (przykład T-SQL)