Запрос upsert sql
Я ищу несколько советов по оптимизации паролей sql хранимых процедур.
С 1-м запросом я делаю вставку, а со вторым я делаю обновление, если данные существуют.
То, что я хочу сделать, - объединить обе хранимые процедуры в одном, где запрос будет проверять, существуют ли данные, чем обновление, иначе вставьте новую строку.
Вот что я имею в это время:
обновление SP:
ALTER PROCEDURE [dbo].[UpdateStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50),
@TitlePosition nvarchar(30))
AS
BEGIN
UPDATE Company_Information
SET First_Name = @First_Name,
Last_Name = @Last_Name,
[email protected],
WHERE UserId = @UserId
END
вставить SP:
ALTER PROCEDURE [dbo].[InsertStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50),
@TitlePosition nvarchar(30))
AS
BEGIN
INSERT INTO Company_Information(UserId,
First_Name,
Last_Name,
Title_Position)
VALUES
(@UserId,
@First_Name,
@Last_Name,
@TitlePosition)
END
Итак, я хотел бы объединить оба SP в одном и SP, чтобы проверить, есть ли уже данные для этого UserId, чем обновление, иначе вставьте новую строку.
Может кто-то, пожалуйста, помогите мне с этим.
Спасибо и счастливые праздники все, Laziale
Ответы
Ответ 1
Заявление MERGE?
CREATE PROCEDURE [dbo].[MERGEStep1](@UserId nvarchar(50), @First_Name nvarchar(50), @Last_Name nvarchar(50), @TitlePosition nvarchar(30))
AS
BEGIN
MERGE Company_Information WITH(HOLDLOCK) AS T
USING(SELECT 1 S) S
ON T.UserId = @UserId
WHEN MATCHED THEN UPDATE SET
First_Name = @First_Name,
Last_Name = @Last_Name,
[email protected]
WHEN NOT MATCHED THEN
INSERT (UserId, First_Name, Last_Name, Title_Position)
VALUES(@UserId, @First_Name,@Last_Name,@TitlePosition);
END
Ответ 2
Выполните следующие действия:
- Создайте переменную для ее проверки (например: @id)
- Выберите @id = UserId из Company_Information где UserId = @UserId
- Если обновление @id = @userId, в противном случае вставьте
Как указано в @gbn, будьте в курсе проблемы согласования.