SQL Server更新异常:Foreach循环执行存储过程致全列值重复
问题分析与解决方案
你的问题核心出在存储过程的变量赋值逻辑上——你在给@server_name赋值时,没有限定只获取当前@number对应的行的short_description,而是直接查询了整个表的所有行。当用变量接收查询结果时,SQL Server会把最后一行的short_description赋值给@server_name,这就导致不管你传入哪个@number,最终都会用同一个处理后的s值去更新server_name字段,自然所有被更新的行都变成了同一个值。
修正后的存储过程
我们需要给SELECT @server_name的语句加上WHERE number = @number条件,确保只获取当前要更新的那行的short_description,同时增加空值判断避免无效操作:
ALTER PROCEDURE [dbo].[getservername8] @number varchar(255) AS BEGIN -- 仅获取当前number对应的short_description DECLARE @server_name varchar(500) SELECT @server_name = short_description FROM [Event_alerts].[dbo].[event_alerts] WHERE number = @number; -- 避免空值导致的SUBSTRING错误 IF @server_name IS NOT NULL AND CHARINDEX('-', @server_name) > 0 BEGIN DECLARE @s AS varchar(50) SELECT @s = SUBSTRING(@server_name, CHARINDEX('-', @server_name) + 15, 50) -- 更新当前number对应的行 UPDATE event_alerts SET server_name = @s WHERE number = @number; END END
C#代码简化(可选)
你的C#代码功能正常,但可以简化参数配置——AddWithValue默认就是输入参数,无需额外设置Direction:
using (SqlCommand command2 = new SqlCommand("getservername8", conn)) { command2.CommandType = CommandType.StoredProcedure; command2.Parameters.AddWithValue("@number", number); command2.ExecuteNonQuery(); }
修改后,每次执行存储过程都会针对传入的@number单独处理对应行的数据,更新后的server_name就会是该行的正确值了。
内容的提问来源于stack exchange,提问作者nandu
相关产品推荐
相关产品推荐

