我有一个存储过程,可以使用动态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困扰,我还没有尝试过。