upsert sql查询

时间:2012-01-02 13:39:19

标签: sql sql-server-2008 stored-procedures

我正在寻找一些如何优化耦合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

插入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,并检查SP是否已存在该UserId的数据而不是更新,否则插入一个新行。 有人可以帮我这个。 谢谢,祝大家节日快乐,Laziale

2 个答案:

答案 0 :(得分:18)

MERGE Statement?

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

答案 1 :(得分:-1)

请按照以下步骤操作:

  1. 创建一个变量来测试它(例如:@id)
  2. 从Company_Information中选择@id = UserId,其中UserId = @UserId
  3. 如果@id = @userId更新,否则插入

  4. 正如@gbn指定的那样,请注意concurrence issues

相关问题