2012-01-02 39 views
10

Tôi đang tìm một số lời khuyên làm thế nào để tối ưu hóa các thủ tục lưu trữ vài sql. Với truy vấn thứ nhất tôi đang thực hiện chèn và với truy vấn thứ hai tôi đang cập nhật, nếu dữ liệu tồn tại. Những gì tôi muốn làm là hợp nhất cả hai thủ tục được lưu trữ trong một, trong đó truy vấn sẽ kiểm tra xem dữ liệu có tồn tại hay không, hãy chèn một hàng mới. Dưới đây là những gì tôi có vào lúc này:upsert truy vấn sql

cập nhật 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 

chèn 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 

Vì vậy, tôi muốn kết hợp cả SP trong một, và các SP để kiểm tra xem liệu đã có dữ liệu cho UserId đó hơn bản cập nhật chưa, hãy chèn một hàng mới. Ai đó có thể giúp tôi với điều này. Cảm ơn và hạnh phúc ngày lễ mọi người, Laziale

Trả lời

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 [Có thể cần 'HOLDLOCK' mặc dù] (http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) –

+0

@MartinSmith Yep , đồng ý –

+0

Cảm ơn sự giúp đỡ của bạn. hoạt động hoàn hảo – Laziale

-1

Thực hiện theo các bước sau:

  1. Tạo một biến để kiểm tra nó (ví dụ: @ id)
  2. Chọn @ id = UserId từ Company_Information trong đó UserId = @UserId
  3. Nếu @id = @userId cập nhật, nếu không hãy chèn

Như @gbn được chỉ định, hãy lưu ý concurrence issues.

+3

Điều này sẽ không đồng thời an toàn. Hai cuộc gọi đồng thời chặt chẽ cả hai có thể suy luận rằng hàng không tồn tại – gbn

+1

Ví dụ http://dba.stackexchange.com/a/9814/630 – gbn