Tim*_*ell 2 sql-server transaction
我有一个大型脚本,用于设置一个新数据库,该数据库在许多表上执行大量身份插入;当我正在扩展它时,由于它正在进行中,我经常遇到暂时性错误。如果这些错误之一介于两者之间set identity_insert [table] on,set identity_insert [table] off并且脚本拒绝第二次运行并显示以下错误:
消息 8107,级别 16,状态 1,第 15 行
IDENTITY_INSERT 已为表“x”打开。无法对表 'y' 执行 SET 操作。
这是一种痛苦!为了解决这个问题,我突出显示“离线”行并手动运行,或者终止连接并重新连接(身份插入是我收集的每个会话)。
我将整个脚本包装在一个事务中,set xact_abort on在顶部,所以我期望服务器返回到错误前的状态。
为什么不是这样?我做错了什么吗,还有比我在这里更强大的方法吗?
以下是重现该行为的最小测试用例。运行两次,注意错误从第一次运行中的类型转换错误到后续运行中的 identity_insert 错误:
-- setup test tables for convenience
if not exists (select * from sys.tables where name = 'bill')
begin
create table bill (id int identity primary key);
end
if not exists (select * from sys.tables where name = 'ben')
begin
create table ben (id int identity primary key, height int);
end
set xact_abort on -- automatically rollback transaction on error
begin tran
print 'adding bill records'
set identity_insert bill on; -- breaks unexpectedly on *second* run
insert into bill (id) values (1);
set identity_insert bill off;
print 'adding ben records'
set identity_insert ben on;
select * from ben
-- insert that intentionally causes error due to type conversion failure
insert into ben (id, height) values (1, 'not an int');
set identity_insert ben off; -- never gets run, as expected
commit
Run Code Online (Sandbox Code Playgroud)
第一次运行的输出(预期行为):
添加账单记录
添加本记录
消息 245,级别 16,状态 1,第 22
行将 varchar 值“非 int”转换为数据类型 int 时转换失败。
第二次运行的输出(意外行为):
添加账单记录
消息 8107,级别 16,状态 1,第 14 行
IDENTITY_INSERT 已针对表“data-test.dbo.ben”启用。无法对表 'bill' 执行 SET 操作。
SELECT @@version 给出:
Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
我在管理工作室和视觉工作室都尝试过这个,只是为了检查它不是一个奇怪的客户端错误。
这是一个会话设置;没有什么可以回滚的。如果您发布了SET DATEFORMAT DMY;or SET LANGUAGE FRENCH;,您是否希望错误使您恢复为MDYor english_us?如果您SET SHOWPLAN打开了,您是否希望回滚停止向您显示后续查询的计划?
公平地说,这个IDENTITY_INSERT案例有点特殊,因为这是我能想到的唯一一个直接与桌子交互的会话设置。但它仍然只适用于您的会话。这种想法可能是您可以继续在多个批次中插入多行,即使在出现错误之后(只要它没有切断连接)。
顺便说一句,您使用的是 SQL Server 2012,那么为什么要使用 SQL Server 7.0 错误处理技术呢?您可以使用TRY/CATCH代替,SET XACT_ABORT然后在打开时关闭设置CATCH(您可以检查)。有关错误处理的良好入门,请参阅 Erland Sommarskog 关于 SQL Server 中的错误和事务处理的文章:
| 归档时间: |
|
| 查看次数: |
3042 次 |
| 最近记录: |