upsert sql查询

Laz*_*ale 10 sql stored-procedures sql-server-2008

我正在寻找一些如何优化耦合sql存储过程的建议.第一个查询我正在插入,而第二个我正在进行更新,如果数据存在.我想要做的是将两个存储过程合并为一个,其中查询将检查数据是否存在而不是更新,否则插入新行.这是我现在所拥有的:

更新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,
    Title_Position=@TitlePosition,  
    WHERE UserId = @UserId
    END
Run Code Online (Sandbox Code Playgroud)

插入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
Run Code Online (Sandbox Code Playgroud)

所以,我想将两个SP合并为一个SP,并检查SP是否已存在该UserId的数据而不是更新,否则插入一个新行.有人可以帮我这个.谢谢,祝大家节日快乐,Laziale

Ole*_*Dok 18

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,
  Title_Position=@TitlePosition  
WHEN NOT MATCHED THEN
  INSERT (UserId, First_Name, Last_Name, Title_Position)
  VALUES(@UserId, @First_Name,@Last_Name,@TitlePosition);
END
Run Code Online (Sandbox Code Playgroud)

  • +1 [可能需要`HOLDLOCK`](http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) (4认同)