1、问题
在 sqlserver2008 数据库 select * from userinfo WHERE username= 'SP4267ED2409011'; 查询结果是1条记录,但执行更新 UPDATE userinfo SET qt = qt + 2.0 WHERE username = 'SP4267ED2409011'; 结果是这样的 Affected rows: 1 Affected rows: 1 返回了2个, 但在另外一个库里返回却是一个 这是为啥?
经过查找是因为增加了触发器的原因
为了防止返回更新多行的状态,可以在触发器中加入 SET NOCOUNT ON;
2、文心一言
在 SQL Server 中,当你看到“Affected rows: 1”的反馈被重复显示两次,这通常不是 SQL Server 本身的行为,因为标准的 SQL Server 消息和返回结果通常不会重复显示同一操作的影响行数。这种情况更可能是由以下几个因素引起的:
-
客户端工具或库的行为:
你使用的客户端工具(如 SQL Server Management Studio (SSMS)、某些 IDE、或者自定义的应用程序)可能在处理 SQL 命令的结果时表现出不同的行为。有些工具可能在执行更新操作后,不仅返回 SQL Server 的实际影响行数,还可能由于自身逻辑而再次报告相同的行数。 -
事务日志的确认:
在某些复杂的事务处理中,如果更新操作涉及多个步骤或嵌套事务,并且每个步骤或事务的结束都被客户端工具捕获并显示,可能会产生看似重复的“Affected rows”报告。然而,这种情况下的重复通常不会以完全相同的方式显示,而是与事务的提交或回滚相关。 -
网络或通信问题:
在某些情况下,网络通信问题或客户端与服务器之间的交互问题可能导致消息被重复发送或接收。 -
客户端脚本或批处理:
如果你是在一个脚本或批处理文件中执行这个 SQL 命令,并且该脚本或批处理文件在某种情况下被重复执行(比如由于循环或条件判断错误),那么你也会看到相同的“Affected rows”消息被多次输出。 -
数据库触发器:
如果 userinfo 表上定义了触发器,并且在触发器中执行了某些操作(包括可能再次更新 userinfo 表或相关的其他表),那么这些操作的影响行数也可能被报告。但是,这通常不会直接导致“Affected rows: 1”的重复显示,除非触发器中的操作也被客户端工具以某种方式单独报告。 -
SQL Server 的特殊配置或版本:
虽然不太可能,但 SQL Server 的某些特殊配置或特定版本的行为可能有所不同。然而,这种情况在 SQL Server 2008 中是极不寻常的。
解决步骤
- 检查客户端工具:确保你使用的客户端工具或库没有错误地重复显示消息。
- 查看脚本或批处理:如果你在使用脚本或批处理,检查是否有任何可能导致命令重复执行的逻辑。
- 检查触发器:如果 userinfo 表上有触发器,请检查触发器的内容,看看是否有任何操作可能间接导致你看到的结果。
- 查看日志:查看 SQL Server 的错误日志和客户端的日志(如果有的话),以获取更多关于发生了什么的线索。
- 简化测试:尝试在一个新的、干净的环境中重复这个操作,看看是否还会出现同样的问题。