一个简单的触发器
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
endset nocount on 语句起和作用,网上大多说是不返回计数,可以提高性能,可这不只是性能的问题吧,报错啊

解决方案 »

  1.   

    set nocount ON|OFF 
    阻止在结果集中返回可显示受 Transact-SQL 语句或存储过程影响的行计数的消息。
    你说的不是报错,是警告.应用程序中如果发生某些错误,会捕捉到此类提示信息并返回给用户,实际上程序并未报错中止
      

  2.   

    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)
               )
    我用你的脚本改了一下,做了测试,原脚本在我这里没有报错,所以我猜测要么你的B表中存在一些约束或者额外的触发器。如果没有,可能你的报错不是在SQLServer层面,而是在应用程序层面,这里有相似的例子,仅供参考:
    http://topic.csdn.net/t/20030324/09/1567751.html
      

  3.   

    比较郁闷,模拟不出来你的错误来这个错误是程序端报的还是 在查询分析器里面?查了一些资料也有人说在上set nocount on 可以解决解决了就好了 呵呵
      

  4.   

    DT OR DS没主键或唯一键?
      

  5.   

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

  6.   

    delphi 的句子,我就是搞这个滴..
    你把代码放到后台去执行,就会发现print出来的内容是黑色字,不是红色
    应用程序的实现多种多样,确实说不好你的程序会不会因为捕捉这个返回的内容而终止
    加上set nocount on 确实不会返回信息,但是你的问题还在于delphi那端的代码出了问题,调试一下,调试器可以捕捉到真正出错的地方的
      

  7.   

    ALTER trigger WriteCreateDT
    on dbo.Weight
    for insert  
    as  
    begin
      set nocount on --增加这句
      update car set isuse=1
    end1.不增加那句,程序逻辑也没错
    2.程序逻辑不错,不等于这个程序是好的,在触发器里对另一个表进行全表更新,恐怕没有程序员这么写的.
      

  8.   


    调试过了,代码执行adoquery1.post时报错,但不知为何要报这个错。
      

  9.   

    把你adoquery1.post 的前后代码贴出来
    把调试报的错误内容也贴出来
      

  10.   

    update car set isuse=1
    为啥没条件呢
      

  11.   

    DELPHI的问题
    或者说ADO调用设置的问题能SET NOCOUNT ON解决就解决了吧
      

  12.   

    看下15楼提到的问题,这样写触发器相当的危险,一般应该连接INSERTED表
      

  13.   


    这样写触发起是否危险,那是另一个问题。
    现在的问题是,为何报错。我将触发器中update语句增加了where条件,改为如下后,照样报错
    ALTER trigger WriteCreateDT
    on dbo.Weight
    for insert  
    as  
    begin
      update car set isuse=1 where isunse=0    --增加了条件where isuse=0
    end