我有一个包含多个SQL语句(INSERT,UPDATE和/或DELETES)的事务.执行时,我想忽略重复错误语句并继续下一个语句.这样做的最佳方法是什么?
Emm*_*uel 64
我认为您正在寻找索引上的IGNORE_DUP_KEY选项.请查看http://msdn.microsoft.com/en-us/library/ms186869.aspx中记录的IGNORE_DUP_KEY ON选项,该选项会导致重复插入尝试产生警告而不是错误.
Phi*_*ley 19
扩展您对SquareCog回复的评论,您可以:
INSERT INTO X VALUES(Y,Z) WHERE Y NOT IN (SELECT Y FROM X)
INSERT INTO X2 VALUES(Y2,Z2) WHERE Y2 NOT IN (SELECT Y FROM X2)
INSERT INTO X3 VALUES(Y3,Z3) WHERE Y3 NOT IN (SELECT Y FROM X3)
Run Code Online (Sandbox Code Playgroud)
在这里,我假设列Y存在于所有三个表中.请注意,如果表未在Y上编制索引,则性能会很差.
哦,是的,Y对它有一个独特的约束 - 所以它们被索引,这应该是最佳的.
zin*_*lon 15
虽然我强烈建议你构建你的sql以便不尝试重复插入(Philip Kelley的代码片段可能是你需要的),但我想提一下语句上的错误并不一定会导致回滚.
除非XACT_ABORT是ON,否则如果遇到错误,事务将不会自动回滚,除非它严重到足以终止连接.XACT_ABORT默认为OFF.
例如,以下sql成功地在表中插入三个值:
create table x ( y int not null primary key )
begin transaction
insert into x(y)
values(1)
insert into x(y)
values(2)
insert into x(y)
values(2)
insert into x(y)
values(3)
commit
Run Code Online (Sandbox Code Playgroud)
除非您正在设置XACT_ABORT,否则会在客户端上引发错误并导致回滚.如果由于某种可怕的原因你无法避免插入重复项,你应该能够在客户端上捕获错误并忽略它.
use*_*593 10
如果通过"Ignore Duplicate Error statments",中止当前语句并继续执行下一个语句而不中止trnsaction,那么只需在每个语句周围放置BEGIN TRY .. END TRY:
BEGIN TRY
INSERT ...
END TRY
BEGIN CATCH /*required, but you dont have to do anything */ END CATCH
...
Run Code Online (Sandbox Code Playgroud)
我想要了解以下内容:
如果99%的数据在没有错误的情况下插入而事先做出选择会导致巨大的性能下降(例如,在我的情况下,从200行/秒到20行/秒),而"哑"插入和偶尔捕获错误.
忽略了"违反PRIMARY KEY约束"错误后,事情又回到了其他资源的瓶颈状态(净空被定义为"瓶颈资源没有的东西").
这就是我首先参与讨论的全部原因.
| 归档时间: |
|
| 查看次数: |
105869 次 |
| 最近记录: |