我正在创建一个处理临时表(#attributeType)的触发器。由于触发器可以多次调用,因此我想确定并检查临时表 #attributeType 是否仍然存在。
这是我在触发器主体中检查临时表的代码:
IF OBJECT_ID('tempdb..#attributeType') IS NOT NULL
BEGIN
DROP TABLE #attributeType
SELECT * INTO #attributeType
FROM attributeType
PRINT 'IN IF'+ CAST(OBJECT_ID('tempdb..#attributeType') AS NVARCHAR(80))
END
ELSE
BEGIN
SELECT * INTO #attributeType
FROM attributeType
PRINT 'IN ELSE'+ CAST(OBJECT_ID('tempdb..#attributeType') AS NVARCHAR(80))
END
当我通过使用 F5 选择代码来测试代码时,我收到此错误消息,指出 #attributeType 临时表存在:
Msg 2714, Level 16, State 1, Line 11
There is already an object named '#attributeType' in the database.
我知道在存储过程中#tempTables将在sp结束后立即被删除,但我仍然不明白为什么我的代码是错误的?
注意 当我注释掉 ELSE block 时,代码可以正常工作。
最佳答案
您对 OBJECT_ID('tempdb..#attributeType')
的测试工作正常。您可以通过单独运行它来测试它,无需 drop
和create
同一批。
问题在于 SQL Server 在运行之前会解析整个批处理。如果它知道#attributeType
存在的话会报错:
SELECT * INTO #attributeType
即使您删除前一行中的表格。
一种解决方案是在不同的批处理中删除表:
IF OBJECT_ID('tempdb..#attributeType') IS NOT NULL
DROP TABLE #attributeType
GO -- new batch
SELECT * INTO #attributeType ...
另一个解决方案是在不同的范围内创建表:
IF OBJECT_ID('tempdb..#attributeType') IS NOT NULL
DROP TABLE #attributeType
exec ('SELECT * INTO #attributeType ...')
关于sql-server - SQL Server,无法使用 if else 语句检查是否#临时表存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25584793/