sql-server - SQL Server,无法使用 if else 语句检查是否#临时表存在

标签 sql-server tsql triggers exists temp-tables

我正在创建一个处理临时表(#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') 的测试工作正常。您可以通过单独运行它来测试它,无需 dropcreate同一批。

问题在于 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/

相关文章:

mysql - 使用 ssis 结果导入到 sql 以将数据移动到下一列

sql - 一对多查询选择所有父级和每个父级的单个顶级子级

sql-server - 使用 T-SQL 的 CASE 表达式

jquery - val() 不会触发 jQuery 中的 change()

jquery - 使用 jquery 事件 keydown 模拟在文本区域上输入不起作用

mysql - 如何设计表来存储用户设置?

sql - 在 CASE THEN 内选择

sql查询获取最早日期

sql - 为什么这个 SELECT 语句没有 FROM?

mysql - 当 TableA.attr 更新时更新 TableB.attr MySQL