0

如果我执行一个删除表的过程,然后使用“SELECT INTO”重新创建它。

如果该过程在删除表后引发异常,是否会发生表删除?

4

2 回答 2

0

除非您将它们包装在事务中,否则表将被删除,因为每个语句都将被视为隐式事务..

下面是一些测试

create table t1
(
id int not null primary key
)

drop table t11
insert into t1
select 1 union all select 1

表 t11 将被删除,即使插入会引发异常..

再举一个例子。。

drop table orderstest
print 'dropped table'
waitfor delay '00:00:05'
select * into orderstest
from Orders

现在 2 秒后,终止会话,您仍然可以看到 orderstest 被丢弃

我检查了除 之外的其他一些语句select into,我看不出为什么select into会有不同的行为,即使您将语句包装在存储过程中,这也适用。

如果您想全部回滚,请使用事务或更好地使用set xact_Abort on

于 2017-10-04T17:10:56.853 回答
0

是的,丢弃的表将消失。当我编写一个新的主键时,我遇到了这个问题。根据表,它将所有数据保存到内存中的表变量中,删除表,使用新 pk 创建一个新表,然后加载数据。如果数据违反了新的 pk,则语句失败并且表变量被删除,留下一个新表并且没有数据。

我的做法是创建一个名称稍有不同的新表,加载数据,在一个语句中更改两个表名,然后在确认加载所有数据后,删除原始表。

于 2017-10-04T17:13:46.233 回答