Warum SQL einen Fehler austriggers, wenn ich einen gesetzlichen Code habe, wird das nie erreicht?

Ich habe ein sehr seltsames Verhalten mit dem unten genannten Code.

--IMPORTANT: Do not use 'GO' since it will terminate --the batch and it is only usable in Microsoft tools --and not in the code itself. --I don't really need a workaround I want to know why --this behavior happens. --Create the first time if doesn't exists IF OBJECT_ID('tempdb.dbo.#temp') IS NULL begin create table #temp (ID datetime) end --I've just created so it should evaluates as False IF OBJECT_ID('tempdb.dbo.#temp') IS NULL begin print 'does not exists' --uncomment the below line and you will see --an error saying table already exists --even though the IF was evaluate as TRUE --create table #temp (ID datetime) end else begin print 'exists' end 

Ich versuche, eine komplexere Skript zu erreichen, aber ich am Ende mit einem Problem zu überprüfen, ob eine temporäre Tabelle existiert und erstellen Sie es, wenn nötig.

In irgendeinem Teil meines Codes kann ich noch keine temporäre Tabelle haben. Also überprüfe ich, ob es existiert und wenn es nicht existiert, möchte ich es schaffen

Das Problem ist, dass, wenn ich nur die Nachricht ausdrucke, die es ausgibt, wie es exists aber wenn ich den Teil, in dem es does not exists , does not exists und ein neues erstellt, wird es vermieden, zu laufen, weil es sagt, dass es bereits existiert.

Warum create table #temp (ID datetime) make SQL den true Teil der IF statement ausführen, wenn er immer als false create table #temp (ID datetime) ?

Ich laufe SQL server 2008 (10.50.2500) in SQL Management Studio 11.0.2100.60

Versuche es so:

 IF OBJECT_ID('#temp') IS NOT NULL begin exec('drop table #temp ') end go create table tempdb..#temp (ID datetime) IF OBJECT_ID('#temp') IS NULL begin select 'does not exists' end else begin select 'exists' end 

oder

 IF OBJECT_ID('tempdb.dbo.#temp') IS NULL begin exec('create table #temp (ID datetime)') end --I've just created so it should evaluates as False IF OBJECT_ID('tempdb.dbo.#temp') IS NULL begin print 'does not exists' --uncomment the below line and you will see --an error saying table already exists --even though the IF was evaluate as TRUE --create table #temp (ID datetime) end else begin print 'exists' end 

Ihr Fehler tritt bei der Parsezeit auf, dh bevor die Abfrage tatsächlich ausgeführt wird. Ersetzen Sie dies:

 create table #temp (ID datetime) 

mit:

 exec('create table #temp (ID datetime)') 

Da exec einen neuen Bereich erstellt, wird die create table nur geparst, wenn die temporäre Tabelle nicht existiert.