I've got a very strange behavior with the below 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
I'm trying to achieve a more complex script but I end up with a problem to verify if a temporary table exists and create it if necessary.
In some part of my code I can have or no a temporary table already created. So I check if it exists and if doesn't exists I want to create it.
The problem is that if I only print the message it evaluates as exists but if I uncomment the part where it does not exists and create a new one it is avoided to run because it say it already exists.
Why uncommenting create table #temp (ID datetime) make SQL run the true part of the IF statement if it always evaluates as false?
I'm running SQL Server 2008 (10.50.2500) in SQL Management Studio 11.0.2100.60
Try this way:
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
or
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
Your error occurs at parse time, that is, before the query is actually executed. Replace this:
create table #temp (ID datetime)
with:
exec('create table #temp (ID datetime)')
Since exec creates a new scope, the create table is only parsed when the temporary table does not exist.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With