Динамическая хранимая процедура для обновления таблицы - PullRequest
0 голосов
/ 12 июня 2019

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

Сначала я попытался создать хранимую процедуру с параметром «switch», который обновлял бы столбцы каждой хранимой процедуры на основе параметра switch.

CREATE PROCEDURE dbo.[Upd_table1] 
    (@switch INT, @ID INT, 
     @col1 INT, @col2 INT, @col3 INT, @col4 INT, @col5 INT,
     @col6 INT, @col7 INT, @col8 INT, @col9 INT)
AS
BEGIN
    IF (@switch = 1)
        UPDATE dbo.table1
        SET col1 = @col1, col4 = @col4, col5 = @col5, col6 = @col6
        WHERE ID = @ID
    ELSE IF (@switch = 2)
        UPDATE dbo.table1
        SET col2 = @col2, col9 = @col9
        WHERE ID = @ID
    ELSE IF (@switch = 3)
        UPDATE dbo.table1
        SET col3 = @col3, col7 = @col7, col8 = @col8
        WHERE ID = @ID
END

Это работает, как и ожидалось, но мне было интересно, есть ли способ удалить коммутатор и обновить таблицу, указав все параметры.

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Я бы использовал COALESCE: вернуть первый ненулевой параметр.

SET COL1 = COALESCE (@ Col1, Col1) = если @ Col1 IS NULL, принять текущее значение col1.Затем вы обновляете все свои поля за одну операцию.

UPDATE dbo.table1
        SET col1 = COALESCE(@col1,col1), col2=COALESCE(@col2,col2), col3=COALESCE(@col3,col3), etc...
        WHERE ID = @ID
0 голосов
/ 12 июня 2019

Существует способ, который эмулирует функциональность коммутатора, основываясь на том факте, что между коммутаторами не обновляются перекрывающиеся столбцы.

CREATE PROCEDURE dbo.[Upd_table1] (@switch INT, @ID INT, @col1 INT, @col2 INT, @col3 INT, @col4 INT, @col5 INT, @col6 INT, @col7 INT, @col8 INT, @col9 INT )
AS
BEGIN
    IF @Col1 IS NOT NULL AND @Col2 IS NULL AND @Col3 IS NULL -- switch = 1 equivalent
        UPDATE dbo.table1
            SET col1 = @col1, col4 = @col4, col5 = @col5, col6 = @col6
        WHERE ID = @ID
    ELSE IF @Col2 IS NOT NULL AND @Col1 IS NULL and @Col3 IS NULL -- switch = 2 equivalent
        UPDATE dbo.table1
            SET col2 = @col2, col9 = @col9
        WHERE ID = @ID
    ELSE IF @Col3 IS NOT NULL AND @Col1 IS NULL and @Col2 IS NULL -- switch = 2 equivalent
        UPDATE dbo.table1
            SET col3 = @col3, col7 = @col7, col8 = @col8
        WHERE ID = @ID
    ELSE
    -- Handle error case of incorrect parameters here
        RAISERROR('Incorrect Parameters passed to [Upd_table1]', 16, 1) -- sample error handler
END
...