日期:2014-05-16  浏览次数:20564 次

sql server 2005使用链接服务器远程插入数据, 出现插入失败但实际已插入, 以及插入时无报错但实际未插入的情况
如题,通过链接服务器往远程数据库插入数据,通过游标一条一条插入,在循环中使用了try catch,目标表有自增字段,网络可能会有一点不好。
但偶尔会出现这2种情况:
1、插入失败但是实际已经插入成功了,第2次尝试插入时发现数据已存在(主键冲突);
2、插入时未报错,但是目标表中无该条数据。。orz

所以我现在只好在每次insert后都查下目标表是否已经存在该条数据,已确认是否插入成功。。

可有人可以解释这是什么原因,以及使用链接服务器时如何判断insert是否成功?
------解决方案--------------------
用游标一条一条的插的话,可以用@@ROWCOUNT>0来判断影响行数的。

另外你这个有时候能插入成功是因为你事务并没有完全回滚

在事务前面加上SET XACT_ABORT ON 试试。
------解决方案--------------------
使用事务也会这样吗

SET XACT_ABORT ON 
------解决方案--------------------
本帖最后由 wufeng4552 于 2014-04-01 15:24:04 编辑
引用:
谢谢fredrickhu的回复, 也谢谢lizhongheng.
@@ROWCOUNT提醒我了, 之前都没想过用这个, 
刚试了下, 即使是链接服务器, 用@@ROWCOUNT>0来判断也是可以的.

另外我不能使用事务, 可能是分布式事务的关系, 我在insert或delete一行时使用事务时会锁整个表.

使用分布式事务
insert 或者delete时锁定整个表 是由于你使用游标的造成的
是否可以不使用游标 非用游标不可?

------解决方案--------------------
引用:
Quote: 引用:

谢谢fredrickhu的回复, 也谢谢lizhongheng.
@@ROWCOUNT提醒我了, 之前都没想过用这个, 
刚试了下, 即使是链接服务器, 用@@ROWCOUNT>0来判断也是可以的.

另外我不能使用事务, 可能是分布式事务的关系, 我在insert或delete一行时使用事务时会锁整个表.

使用分布式事务
insert 或者delete时锁定整个表 是由于你使用游标的造成的
是否可以不使用游标 非用游标不可?

建议不要在游标中向链接服务器插数据,而是在本地建临时表,游标循环插入完成后,再从临时表插入链接服务器