灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2236回复:0

[SQL Server]sql set nocount on问题

楼主#
更多 发布于:2013-05-25 15:03
sql set nocount on问题
 
数据库有表A,B,现在有一个需求, 当表A修改、增加、删除时候,更新表B内的一个字段。
 
     汗,听着挺简单的,于是呼呼呼就开始写了。
 
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[SystemName_IUD]
on [dbo].[SystemName]
after update,insert,delete
as
if (@@rowcount>0)
begin
    update [dbo].[PageInfo] set Version=getdate() where Page='RSM'
end
     呵呵,挺简单的么。 好的,运行, 开始测试。
 
     晕,当手动修改A表的数据,提示不能修改。 提示错误看不明白,
 
     试试用UPDATE修改,可以修改。
 
     狂找资料,无从下手。
 
     后来求救我们经理,2句话给搞定了。
 
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[SystemName_IUD]
on [dbo].[SystemName]
after update,insert,delete
as
if (@@rowcount>0)
begin
    set nocount on
    update [dbo].[PageInfo] set Version=getdate() where Page='RSM'
    set nocount off
end
     赶快网上搜下  set nocount on  .. . 什么意思。
 
当 SET NOCOUNT 为 ON 时,不返回计数。当 SET NOCOUNT 为 OFF 时,返回计数。
 
即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。
 
当 SET NOCOUNT 为 ON 时,将不向客户端发送存储过程中每个语句的 DONE_IN_PROC 消息。如果存储过程中包含一些并不返回许多实际数据的语句,网络通信流量便会大量减少,因此,将 SET NOCOUNT 设置为 ON 可显著提高性能。
 
SET NOCOUNT 指定的设置是在执行或运行时生效,而不是在分析时生效。    
 
如果存储过程中有多个语句,则默认情况下,SQL Server在每个语句完成时给客户端应用程序发送一条消息,详细说明每个语句所影响的行数。大多数应用程序不需要这些消息。如果确信应用程序不需要他们,可以禁用这些消息,以提高慢速网络的性能。我们就可以通过SET NOCOUNT会话设置为应用程序禁用这些消息。(其实大部分应用程序都不需要这个值)
需要注意的是:
1.存储过程:
象create table返回了记录集,而且连insert into语句也返回了记录集,不过该记录集得一种特别的记录集(没有字段,不能对该记录集进行任何操作), OLEDB和ODBC存在一个很大的差别,向odbc取记录集时,odbc过滤了上面所称的特殊记录集(那种只占位置但不能进行任何操作的记录集——多由create table或insert into产生),而向oledb取记录集时,oledb并没有将特殊记录集过滤。所以在使用存储过程返回记录集时,在不希望返回记录的地方,应该使用set nocount on禁止存储过程返回记录集,否则可能会绕很多弯路。
2.触发器:
    建议不要让触发器返回任何结果。这是因为对这些返回结果的特殊处理必须写入每个允许对触发器表进行修改的应用程序中。为了阻止从触发器返回任何结果,不要在触发器内定义包含SELECT语句或变量赋值。如果必须在触发器中进行变量赋值,则应该在触发器的开头使用SET NOCOUNT ON语句以避免返回任何结果集。
 
=================================================================
 
举例:如果Monster出现上述情况
 
企业管理器----选择sql服务器----选择数据库MUDDB---点企业管理器菜单里的“工具”----选择“SQL查询分析器”----打开后粘贴以下内容:
——————————————————————————————————
select distinct * into #temp from Monster
 
truncate table Monster
 
insert Monster select * from #temp
 
drop table #temp
——————————————————————————————————
 
先点 “对号”   再点“执行”  完成了。现在问题就解决了!!

喜欢0 评分0
游客

返回顶部