Одинаковые результаты обновляются во всех строках с использованием предложения where в SQL Server - PullRequest
0 голосов
/ 30 мая 2020

Я запускаю хранимую процедуру внутри foreach l oop in c#. После завершения все строки столбца обновляются с максимальным значением. Ниже приведена хранимая процедура:

ALTER PROCEDURE [dbo].[getservername8]
    @number varchar(255)
AS
    DECLARE @server_name varchar(500)

    SELECT @server_name = short_description 
    FROM [Event_alerts].[dbo].[event_alerts]

    DECLARE @s AS varchar(50)

    SELECT @s = SUBSTRING(@server_name, CHARINDEX('-', @server_name) + 15, 50)

    UPDATE event_alerts 
    SET server_name = @s 
    WHERE number = @number

Это код C#:

using (SqlCommand command2 = new SqlCommand("getservername8", conn))
{
    command2.CommandType = CommandType.StoredProcedure;

    command2.Parameters.AddWithValue("@number",number);
    command2.Parameters["@number"].Direction = ParameterDirection.Input;

    command2.ExecuteNonQuery();
}

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

В вашем коде есть допустимое предложение where, поэтому он должен обновлять только совпадающие строки. Я могу только предположить, что все строки имеют одинаковое значение для number.

Однако, похоже, у вас есть ошибка в определении @server_name - и это может быть проблемой, о которой вы говорите. Здесь нет предложения where, поэтому для него установлено значение произвольное - возможно, из того, что вы бы назвали «последней строкой». Хотя эта номенклатура - неправильное толкование того, что происходит.

В любом случае ваш ИП слишком сложен. Я подозреваю, что вы имеете в виду:

alter procedure [dbo].[getservername8] (
    @number varchar(255)
) as
begin
    update ea
        set server_name = substring(short_description, charindex('-', short_description) + 15, 50)
        from event_alerts ea 
        where number = @number;
end;  -- getservername8

Также обратите внимание на хорошие методы программирования:

  • Операторы заканчиваются точкой с запятой.
  • В теле SP используется begin / end.
  • end помечено именем SP.
0 голосов
/ 30 мая 2020

Причина в том, что вы получаете одинаковое значение @server_name для каждого вызова. Так что @s си тоже для всех. поэтому вы вставляете то же значение в столбец

select  @server_name = short_description from [Event_alerts].[dbo].[event_alerts]
declare @s as varchar(50)
select @s= SUBSTRING(@server_name, CHARINDEX('-', @server_name) + 15, 50)
...