Commish13 Ответов: 1

Попытка обновить несколько строк в столбце с одинаковым значением данных


I have a table that is keeping track of teams wins and lost throughout a season.

TeamRecordId____|___Won___|___Lost___|
                |         |          |
___1____________|_Rebels__|__Tigers__|
                |         |          |
___2____________|_Stars___|_Comets___|
                |         |          |
__3_____________|_Raptors_|_Mayhem___|


My Insert Stored Procedure works but I can't figure out how to do a Update Procedure.

Thanks, any help would be appreciated


Что я уже пробовал:

Вставить Proc
Изменить процедуру [dbo].[InsertTeamRecord]
(
@Week nvarchar(20),
@Game_1_Won nvarchar(20),
@Game_1_Lost nvarchar(20),
@Game_2_Won nvarchar(20),
@Game_2_Lost nvarchar(20),
@Game_3_Won nvarchar(20),
@Game_3_Lost nvarchar(20)
)
АС


Вставить в TeamRecord(неделя, выигранная, проигранная)
Значения(@Week, @Game_1_Won, @Game_1_Lost),(@Week, @Game_2_Won, @Game_2_Lost),(@Week, @Game_3_Won, @Game_3_Lost)



Обновление Конф:

Нет никакого потерянного случая, потому что я получаю ошибку каждый раз, когда пытаюсь поместить потерянный случай в свой код.

Изменить процедуру [dbo].[UpdateTeamRecord]
(
@Week nvarchar(20),
@Game_1_Won nvarchar(20),
@Game_1_Lost nvarchar(20),
@Game_2_Won nvarchar(20),
@Game_2_Lost nvarchar(20),
@Game_3_Won nvarchar(20),
@Game_3_Lost nvarchar(20)
)
АС

Обновить установить TeamRecord выиграл = случай, когда выиграл = @Game_1_Won тогда @Game_1_Won
Когда выиграли = @Game_2_Won, то @Game_2_Won

#realJSOP

Это довольно дерьмовая схема, которую вы там придумали...

MadMyche

То же самое говорит и Джон.

Попробуйте использовать поля ( GameID, HomeTeamID, GuestTeamID, HomeScore, GuestScore), которые могут быть целыми числами. Все остальное можно рассчитать исходя из этого.

GameID должен ссылаться на игровой стол с деталями игры.
Главная и гостевая команды будут ссылаться на командную таблицу

1 Ответов

Рейтинг:
0

Richard Deeming

Как бы то ни было, нет никакого способа написать разумную процедуру обновления, потому что нет никакого способа определить, какая запись относится к какой игре.

Вам придется либо удалить данные за неделю, а затем вставить их снова:

ALTER PROCEDURE [dbo].[UpdateTeamRecord]
(
    @Week nvarchar(20),
    @Game_1_Won nvarchar(20),
    @Game_1_Lost nvarchar(20),
    @Game_2_Won nvarchar(20),
    @Game_2_Lost nvarchar(20),
    @Game_3_Won nvarchar(20),
    @Game_3_Lost nvarchar(20)
)
AS
BEGIN
    SET NOCOUNT ON;
    
    DELETE FROM TeamRecord WHERE Week = @Week;
    
    INSERT INTO TeamRecord(Week, Won, Lost)
    VALUES
        (@Week, @Game_1_Won, @Game_1_Lost),
        (@Week, @Game_2_Won, @Game_2_Lost),
        (@Week, @Game_3_Won, @Game_3_Lost)
    ;
END

Или отсортируйте строки за неделю по идентификатору и обновите их на основе этого идентификатора:
ALTER PROCEDURE [dbo].[UpdateTeamRecord]
(
    @Week nvarchar(20),
    @Game_1_Won nvarchar(20),
    @Game_1_Lost nvarchar(20),
    @Game_2_Won nvarchar(20),
    @Game_2_Lost nvarchar(20),
    @Game_3_Won nvarchar(20),
    @Game_3_Lost nvarchar(20)
)
AS
BEGIN
    SET NOCOUNT ON;
    
    WITH cteWeekRecords As
    (
        SELECT
            Id,
            ROW_NUMBER() OVER (ORDER BY Id) As GameNumber
        FROM
            TeamRecord
        WHERE
            Week = @Week
    ),
    cteNewRecords As
    (
        SELECT
            Id,
            CASE GameNumber
                WHEN 1 THEN @Game_1_Won
                WHEN 2 THEN @Game_2_Won
                WHEN 3 THEN @Game_3_Won
            END As Won,
            CASE GameNumber
                WHEN 1 THEN @Game_1_Lost
                WHEN 2 THEN @Game_2_Lost
                WHEN 3 THEN @Game_3_Lost
            END As Lost
        FROM
            cteWeekRecords
        WHERE
            GameNumber In (1, 2, 3)
    )
    UPDATE
        R
    SET
        Won = S.Won,
        Lost = S.Lost
    FROM
        TeamRecord As R
        INNER JOIN cteNewRecords As S
        ON S.Id = R.Id
    ;
END