为什么 DROP TABLE 在 SELECT INTO 之前似乎没有生效?
Why DROP TABLE doesn't seem to take effect before a SELECT INTO?
下面的 tSQL 查询让我感到困惑:
select 1 as FIELD into #TEMP
drop table #TEMP
select 1 as FIELD into #TEMP
当我从 SQL Server Management Studio 会话 window 运行 它时(按 F5 到整个查询,作为一个组) ,我收到以下错误:
Msg 2714, Level 16, State 1, Line 3
There is already an object named '#TEMP' in the database.
请注意,在执行查询之前 table #TEMP
不存在。
我认为代码不应产生任何错误,因为第 2 行正在删除临时 table。但是执行到第3行好像drop没有生效
我的问题:
- 为什么会出现错误?
- 如何修复查询以使其按预期执行?
PS。上面的查询是我的一个现实世界查询的简化,它显示出相同的症状。
PS2。不管这是否是一种合理的编程实践(正如 Sean 在他的评论中所暗示的那样),这种意想不到的行为促使我寻找有关如何解析这些查询的信息,希望这些知识对我将来有所帮助。
在这里试试这个:
select 1 as FIELD into #TEMP
drop table #TEMP
GO
select 1 as FIELD into #TEMP
我发现现有表的查找方式不同:
select 1 as FIELD into #TEMP
drop table #TEMP
当您在这些命令后使用 into
语句时:
select 1 as FIELD into #TEMP
错误是:
There is already an object named '#TEMP' in the database.
并且当您在 #TEMP
上使用 select
后这些命令时:
select * from #TEMP
错误是:
Invalid object name '#TEMP'.
所以,在第一种情况下,有一个名称为 #TEMP
的对象,在另一种情况下,没有一个名称为 #TEMP
的对象!
technet.microsoft
的重要说明是:
DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch. Otherwise an unexpected error may occur.
在 SQL 服务器数据库引擎删除表的注释中:
The SQL Server Database Engine defers the actual page deallocations, and their associated locks, until after a transaction commits.
所以使用 select
语句的第二个错误可能与 实际页面释放有关 而使用 into
语句的第一个错误可能与 从关联锁到事务提交之间的持续时间。
下面的 tSQL 查询让我感到困惑:
select 1 as FIELD into #TEMP
drop table #TEMP
select 1 as FIELD into #TEMP
当我从 SQL Server Management Studio 会话 window 运行 它时(按 F5 到整个查询,作为一个组) ,我收到以下错误:
Msg 2714, Level 16, State 1, Line 3
There is already an object named '#TEMP' in the database.
请注意,在执行查询之前 table #TEMP
不存在。
我认为代码不应产生任何错误,因为第 2 行正在删除临时 table。但是执行到第3行好像drop没有生效
我的问题:
- 为什么会出现错误?
- 如何修复查询以使其按预期执行?
PS。上面的查询是我的一个现实世界查询的简化,它显示出相同的症状。
PS2。不管这是否是一种合理的编程实践(正如 Sean 在他的评论中所暗示的那样),这种意想不到的行为促使我寻找有关如何解析这些查询的信息,希望这些知识对我将来有所帮助。
在这里试试这个:
select 1 as FIELD into #TEMP
drop table #TEMP
GO
select 1 as FIELD into #TEMP
我发现现有表的查找方式不同:
select 1 as FIELD into #TEMP
drop table #TEMP
当您在这些命令后使用 into
语句时:
select 1 as FIELD into #TEMP
错误是:
There is already an object named '#TEMP' in the database.
并且当您在 #TEMP
上使用 select
后这些命令时:
select * from #TEMP
错误是:
Invalid object name '#TEMP'.
所以,在第一种情况下,有一个名称为 #TEMP
的对象,在另一种情况下,没有一个名称为 #TEMP
的对象!
technet.microsoft
的重要说明是:
DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch. Otherwise an unexpected error may occur.
在 SQL 服务器数据库引擎删除表的注释中:
The SQL Server Database Engine defers the actual page deallocations, and their associated locks, until after a transaction commits.
所以使用 select
语句的第二个错误可能与 实际页面释放有关 而使用 into
语句的第一个错误可能与 从关联锁到事务提交之间的持续时间。