sql >> Database >  >> RDS >> Sqlserver

T-Sql lijkt de If-instructie te evalueren, zelfs als de voorwaarde niet waar is

SQL Server parseert de instructie en valideert deze, waarbij eventuele if-voorwaarden worden genegeerd. Daarom faalt het volgende ook:

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

Of je nu op Uitvoeren drukt of gewoon op Parseren, dit resulteert in:

SQL Server weet niet of het kan schelen welke tak van een voorwaardelijke wordt ingevoerd; het valideert hoe dan ook alle verklaringen in een batch. U kunt dingen doen als (vanwege uitgestelde naamresolutie):

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

Maar je kunt niet doen:

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

De tijdelijke oplossing is meestal om dynamische SQL te gebruiken:

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. Verificatie mislukt fout met postgresql vanaf de opdrachtregel

  2. In MySQL:Hoe geef ik een tabelnaam door als opgeslagen procedure en/of functieargument?

  3. CodeIgniter result_array() op booleaanse fout als de tabel leeg is

  4. Postgres-trigger om Java-cache bij te werken