首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于 Set nocount on 的有关问题

2012-11-05 
关于 Set nocount on 的问题一个简单的触发器ALTERtrigger WriteCreateDTon dbo.Weightfor insertasbeginu

关于 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 WriteCreateDTon dbo.Weightfor insert  as  begin  set nocount on --增加这句  update car set isuse=1end
[解决办法]
探讨
引用:
引用:
调试过了,代码执行adoquery1.post时报错,但不知为何要报这个错。

[解决办法]
update car set isuse=1
为啥没条件呢
[解决办法]
DELPHI的问题
或者说ADO调用设置的问题

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

热点排行