下面的 SQL 查询让我感到困惑:
select 1 as FIELD into #TEMP
drop table #TEMP
select 1 as FIELD into #TEMP
When I run it from SQL Server Management Studio session window (pressing F5 to the whole query, as a group), I get the following error:
消息 2714,第 16 级,状态 1,第 3 行
数据库中已有一个名为“#TEMP”的对象。
注意该表#TEMP
在执行查询之前不存在。
我认为代码不应该产生任何错误,因为第 2 行正在删除临时表。但执行第 3 行时,好像 drop 并未生效。
我的问题:
- 为什么会发生错误?
- 如何修复查询,使其按预期执行?
附言。上面的查询是我的现实世界查询的简化,它显示出相同的症状。
PS2。不管这是否是一个合理的编程实践(正如 Sean 在他的评论中暗示的那样),这种意想不到的行为促使我寻找有关如何解析这些查询的信息,希望这些知识将来对我有所帮助。
我发现现有表的查找是不同的:
select 1 as FIELD into #TEMP
drop table #TEMP
当你使用into
这些命令之后的语句:
select 1 as FIELD into #TEMP
错误是:
数据库中已有一个名为“#TEMP”的对象。
当你使用select
on #TEMP
在这些命令之后:
select * from #TEMP
错误是:
对象名称“#TEMP”无效。
所以,在第一种情况下,有一个对象#TEMP
名称,在另一种情况下,没有一个对象#TEMP
name !.
来自的重要说明technet.microsoft
is:
DROP TABLE 和 CREATE TABLE 不应在同一批处理中的同一表上执行。否则可能会出现意外错误。
在通过 SQL Server 数据库引擎删除表的注释中:
SQL Server 数据库引擎将实际的页释放及其关联的锁推迟到事务提交之后。
所以使用时出现第二个错误select
声明可能涉及实际的页面释放以及使用时的第一个错误into
声明可能涉及关联锁与事务提交之间的持续时间.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)