Запрос 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, будьте в курсе проблемы согласования.