使用动态SQL更新记录和删除记​​录的存储过程

时间:2019-06-13 19:49:24

标签: sql-server tsql

我有一个存储过程,可以使用动态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存储过程的代码。如果您可以通过类似的存储过程来更新表,以及从表中删除记录的存储过程来帮助我,我将不胜感激。如果可以使用IF语句将所有三个过程(INSERT,UPDATE和DELETE)包含在一个存储过程中,那将是理想的选择。

已编辑:

这是我拥有的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)类型,并且在SP的执行过程中似乎无法使用HASHBYTES函数

就DELETE SP而言,由于尚未被UPDATE SP困扰,我还没有尝试过。

0 个答案:

没有答案