sql >> Databasteknik >  >> RDS >> Sqlserver

T-Sql verkar utvärdera If-satsen även när villkoret inte är sant

SQL Server analyserar satsen och validerar den, och ignorerar eventuella if-villkor. Det är därför följande också misslyckas:

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

Oavsett om du trycker på Execute eller bara Parse, resulterar detta i:

SQL Server vet inte eller bryr sig inte om vilken gren av en villkorlig som kommer att anges; det validerar alla påståenden i en batch ändå. Du kan göra saker som (på grund av uppskjuten namnupplösning):

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

Men du kan inte göra:

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

Lösningen är vanligtvis att använda dynamisk 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. Hur söker jag från serialize-fältet i mysql-databasen?

  2. Ändra användardefinierad typ i SQL Server

  3. MySQL SELECT unik kolumn där annan kolumn är max

  4. Fel på tidsstämpelkolumnen mysql