Хранимая процедура обновления и удаления записей с использованием динамического SQL - PullRequest
0 голосов
/ 13 июня 2019

У меня есть хранимая процедура, которая вставляет записи в указанную таблицу схем с использованием динамического sql.Чтобы указать, в какую схему вы хотите вставить, это делается следующим образом:

EXEC Stored_Procedure_Name '[Schema_Name]', 'value1', 'value2', ...

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

Я попытался изменить код, чтобы сделать его UPDATE (вместо INSERT INTO) таблицы, но логика, лежащая в их основе, не имеет никакого смысла.

if object_id('AddUser_proc', 'AU') is not null
begin
    drop proc AddUser_proc;
end;
GO

CREATE PROCEDURE AddUser_proc
    (@branch VARCHAR(50), 
     @UserID NUMERIC(13,0), 
     @Username VARCHAR(50), 
     @Email VARCHAR(50),
     @Fullname VARCHAR(100), 
     @Password BINARY(64),
     @DateCreated DATETIME,
     @ClosestBranch VARCHAR(50)    )
AS
BEGIN

    IF EXISTS(
        SELECT 1
        FROM Sys.Schemas
        WHERE name = @branch
    )
    BEGIN

    DECLARE @dynamic nvarchar(4000), 
            @paramDefinition nvarchar(4000)


        SELECT @dynamic = N'INSERT INTO '+ quotename(@branch) + N'.User_tbl (
            UserID,
            Username,
            Email,
            Fullname,
            Password,
            DateCreated,
            ClosestBranch
        )
        VALUES(@UserID, @Username, @Email, @Fullname, @Password, @DateCreated, @ClosestBranch)',
        @paramDefinition = 
          N'@UserID numeric(13,0), 
            @Username varchar(50), 
            @Email varchar(50), 
            @Fullname varchar(100), 
            @Password binary(64),
            @DateCreated datetime,
            @ClosestBranch varchar(50)'

        EXEC sp_executeSql  @dynamic, @paramDefinition, @UserID, @Username, @Email, @Fullname, @Password,
                            @DateCreated, @ClosestBranch;
    END
END
GO

Выше приведен код, который я имею для хранимой процедуры INSERT.Буду признателен, если вы поможете мне с похожей хранимой процедурой, которая обновляет таблицы, а также с процедурой, которая удаляет записи из таблиц.Было бы идеально, если бы все три (INSERT, UPDATE и DELETE) процедуры могли содержаться в одной хранимой процедуре с использованием операторов IF.

EDITED:

Это тот SP, который у меня есть:

if object_id('UpdateUser_proc', 'UU') is not null
    begin
        drop proc UpdateUser_proc;
    end;
GO
CREATE PROCEDURE UpdateUser_proc(
    @branch varchar(50), 
    @UserID numeric(13,0), 
    @Username varchar(50), 
    @Email varchar(50),
    @Fullname varchar(100), 
    @Password binary(64),
    @DateCreated datetime,
    @ClosestBranch varchar(50)
)
AS
BEGIN

    IF EXISTS(
        SELECT 1
        FROM Sys.Schemas
        WHERE name = @branch
    )
    BEGIN

    DECLARE @dynamic nvarchar(4000), 
            @paramDefinition nvarchar(4000)


        SELECT @dynamic = N'UPDATE '+ quotename(@branch) + N'.User_tbl
        SET Username=@Username,Email=@Email,Fullname=@Fullname,Password=@Password,DateCreated=@DateCreated,ClosestBranch=@ClosestBranch
        WHERE UserID=@UserID',
        @paramDefinition = 
          N'@UserID numeric(13,0), 
            @Username varchar(50), 
            @Email varchar(50), 
            @Fullname varchar(100), 
            @Password binary(64),
            @DateCreated datetime,
            @ClosestBranch varchar(50)'

        EXEC sp_executeSql  @dynamic, @paramDefinition, @UserID, @Username, @Email, @Fullname, @Password,
                            @DateCreated, @ClosestBranch;
    END
END
GO

И я выполняю это так:

EXEC UpdateUser_proc 'Bloemfontein', '7928623003512', 'klover', 'test.g@g.com', 'John Snow', 'password', '20190303', 'Bloemfontein'

Я обнаружил, что проблема может быть в том, что поле пароля имеет двоичный (64) тип иКажется, я не могу использовать функцию HASHBYTES во время выполнения SP

. Что касается DELETE SP, я еще не пытался ее выполнить, так как застрял с UPDATE SP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...