日期:2014-05-17  浏览次数:20439 次

关于 Set nocount on 的问题
一个简单的触发器
ALTER trigger WriteCreateDT
on dbo.Weight
for insert 
as 
begin
  update car set isuse=1
end

为何报错 “无法为更新行集定位:一些值可能已在最后读取后改变”

而增加 Set nocount on 语句后(如下),就不报错了呢
ALTER trigger WriteCreateDT
on dbo.Weight
for insert 
as 
begin
  set nocount on --增加这句
  update car set isuse=1
end

set nocount on 语句起和作用,网上大多说是不返回计数,可以提高性能,可这不只是性能的问题吧,报错啊

------解决方案--------------------
set nocount ON|OFF 
阻止在结果集中返回可显示受 Transact-SQL 语句或存储过程影响的行计数的消息。
你说的不是报错,是警告.应用程序中如果发生某些错误,会捕捉到此类提示信息并返回给用户,实际上程序并未报错中止
------解决方案--------------------
SQL code
CREATE trigger test
 on dbo.a
 for insert  
 as  
 begin
   update b set id=id+1
 END
 
 
 INSERT INTO dbo.a
         ( id, c, d )
 VALUES  ( 1, -- id - int
           '2', -- c - char(2)
           '3'  -- d - char(3)
           )

------解决方案--------------------
比较郁闷,模拟不出来你的错误来

这个错误是程序端报的还是 在查询分析器里面?

查了一些资料也有人说在上set nocount on 可以解决

解决了就好了 呵呵
------解决方案--------------------
原语句是没问题的,根据报错信息提示,无法为更新行集定位,可能是你的b表存在相同的行而且没有设置主键,
一些值可能已在最后读取后改变,可能是应用程序有读取操作而产生了行锁。加事务控制试试
------解决方案--------------------
探讨
引用:
set nocount ON|OFF
阻止在结果集中返回可显示受 Transact-SQL 语句或存储过程影响的行计数的消息。
你说的不是报错,是警告.应用程序中如果发生某些错误,会捕捉到此类提示信息并返回给用户,实际上程序并未报错中止

感谢你的关注

事实上是应用程序报错了。

------解决方案--------------------
探讨
表是有主键的,而且插入的也是主键值不同的数据。

经过测试发现
在程序端使用insert语句插入就不报错
在程序端使用如下方法时就报错。
adoquery.open;
adoquery.append;
adoquery.fieldbyname('主键字段').asstring:='值';
adoquery.post;

------解决方案--------------------
SQL code
ALTER trigger WriteCreateDT
on dbo.Weight
for insert  
as  
begin
  set nocount on --增加这句
  update car set isuse=1
end

------解决方案--------------------
探讨
引用:
引用:
调试过了,代码执行adoquery1.post时报错,但不知为何要报这个错。

------解决方案--------------------
update car set isuse=1
为啥没条件呢
------解决方案--------------------
DELPHI的问题
或者说ADO调用设置的问题

能SET NOCOUNT ON解决就解决了吧
------解决方案--------------------
看下15楼提到的问题,这样写触发器相当的危险,一般应该连接INSERTED表