You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:37:25