У меня есть хранимая процедура, которая вставляет записи в указанную таблицу схем с использованием динамического 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.