以下(已清理的)代码有时会产生以下错误:
无法删除表'database.dbo.Table',因为它不存在或您没有权限.
数据库中已经有一个名为"Table"的对象.
begin transaction if exists (select 1 from database.Sys.Tables where name ='Table') begin drop table database.dbo.Table end Select top 3000 * into database.dbo.Table from OtherTable commit select * from database.dbo.Table
代码可以同时运行多次.谁知道它为什么会破裂?
我可以问你为什么先这样做吗?您应该考虑使用临时表或提出另一种解决方案.
我不肯定DDL语句在事务中与DML语句的行为相同,并且看到一篇博客文章有一个奇怪的行为并在DDL中创建存储过程.
请注意,您可能需要验证事务隔离级别并将其设置为Serialized.
编辑基于快速测试,我在两个不同的连接中运行相同的sql,当我创建表但没有提交事务时,第二个事务被阻止.所以它看起来应该有效.我仍然会警告这种类型的设计.