2012-01-02 56 views
10

我正在寻找一些建议如何优化情侣sql存储过程。 对于第一个查询,我正在进行插入操作,如果数据存在,则使用第二个查询进行更新。 我想要做的是将两个存储过程合并为一个,其中查询将检查数据是否存在,而不是更新,否则插入一个新行。 这是我在这个时候:upsert 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, 
    [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

回答

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, 
    [email protected] 
WHEN NOT MATCHED THEN 
    INSERT (UserId, First_Name, Last_Name, Title_Position) 
    VALUES(@UserId, @First_Name,@Last_Name,@TitlePosition); 
END 
+4

+1 [可能需要HOLDLOCK'](http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) – 2012-01-02 14:03:22

+0

@MartinSmith Yep ,同意 – 2012-01-02 14:04:05

+0

感谢您的帮助。这是完美的 – Laziale 2012-01-02 16:28:07

-1

遵循以下步骤:

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

作为@gbn指定,请注意concurrence issues

+3

这不会是并发安全的。两个紧密并发的调用可以推断该行尚不存在 – gbn 2012-01-02 13:46:06

+1

示例http://dba.stackexchange.com/a/9814/630 – gbn 2012-01-02 13:50:31