2012-01-02 10 views
10

मैं कुछ सलाह ढूंढ रहा हूं कि जोड़े एसक्यूएल संग्रहीत प्रक्रियाओं को अनुकूलित कैसे करें। पहली क्वेरी के साथ मैं सम्मिलित कर रहा हूं, और दूसरे के साथ मैं अद्यतन कर रहा हूं, यदि डेटा मौजूद है। मैं जो करना चाहता हूं वह एक संग्रहीत प्रक्रियाओं को एक में विलय कर रहा है, जहां क्वेरी जांच करेगी कि डेटा अपडेट से मौजूद है या नहीं, अन्यथा एक नई पंक्ति डालें।अपर एसक्यूएल क्वेरी

अद्यतन सपा:

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 

डालने सपा:

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 

तो, मैं एक में दोनों सपा मर्ज करना चाहते हैं, और सपा को यहाँ मैं इस समय है जांचें कि अद्यतन के मुकाबले उस उपयोगकर्ता आईडी के लिए पहले से ही डेटा है, अन्यथा एक नई पंक्ति डालें। क्या कोई इस के साथ मेरी मदद कर सकता है। धन्यवाद और खुश छुट्टियों हर किसी को, 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 [शायद 'होल्डॉक' की आवश्यकता हो सकती है] (http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx) –

+0

@ मार्टिनस्मिथ हाँ , –

+0

आपकी सहायता के लिए धन्यवाद। यह सही काम करता है – Laziale

-1

इन चरणों का पालन करें:

  • @id करें = प्रयोक्ता-आईडी:

    1. यह (@id पूर्व) का परीक्षण करने के एक चर बनाएं Company_Information से जहां UserId = @UserId
    2. @id = @userId अद्यतन, अन्यथा
    3. सम्मिलित करें

    निर्दिष्ट @gbn के रूप में, concurrence issues से अवगत रहें।

  • +3

    यह समेकन सुरक्षित नहीं होगा। दो बारीकी से समवर्ती कॉल दोनों यह समझ सकते हैं कि पंक्ति अभी तक मौजूद नहीं है – gbn

    +1

    उदाहरण http://dba.stackexchange.com/a/9814/630 – gbn

    संबंधित मुद्दे