2012-01-02 25 views
10

Çift sql saklı yordamları en iyi duruma getirme konusunda bazı öneriler arıyorum. 1. sorgu ile ekleme yapıyorum ve 2. ile veri varsa, güncelleştirme yapıyorum. Yapmak istediğim, saklı yordamları bir arada bir araya getirmektir; burada sorgu, verilerin güncellemeden olup olmadığını kontrol ederse, yeni bir satır ekleyin.Yükseltme sql sorgusu

güncelleme 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 

insert 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 

Yani, birinde hem SP birleştirmek istiyorum ve SP için Buraya Ben şu anda ne var Bu UserId için zaten güncellenmiş bir veri olup olmadığını kontrol edin, yeni bir satır ekleyin. Birisi bana bu konuda yardımcı olabilir. Teşekkür ve mutlu tatiller herkes Laziale'daki

cevap

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 [Gereksinim 'HOLDLOCK' olsa] (http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) –

+0

@MartinSmith Yep , kabul –

+0

Yardımlarınız için teşekkürler. Bu mükemmel çalışıyor – Laziale

-1

aşağıdaki adımları izleyin:

  • seç @id = KullanıcıNo:

    1. onu (@id ex) test etmek için bir değişken oluşturma from UserId = @UserId
    2. @id = @ userId güncelleştirmesi, aksi takdirde

    @gbn belirtildiği gibi, concurrence issues'un farkında olun.

  • +3

    Bu, eş zamanlı güvenli olmayacaktır. İki yakın eşzamanlı çağrı, satırın henüz mevcut olmadığını belirtebilir. – gbn

    +1

    Örnek http://dba.stackexchange.com/a/9814/630 – gbn