2013-02-15 16 views
6

मैं सीखने की कोशिश कर रहा हूं कि एमईआरईजी ऑपरेटर का उपयोग कैसे करें। निम्नलिखित कोड सही तरीके से संकलित:SQL सर्वर में विलय कैसे डिबग करें?

ALTER PROCEDURE moto.procPM_UpdateLines 
@LineId As Int = null, 
@LineName As Varchar(100), 
@DeleteMe As Bit = 0 
    AS 
    BEGIN 

    MERGE moto.tblPMLine AS line 
    USING (SELECT LineId, LineName FROM moto.tblPMLine) AS existsLine 
    ON line.LineId = existsLine.LineId 
    WHEN MATCHED AND @DeleteMe = 1 THEN DELETE 
    WHEN MATCHED AND @DeleteMe = 0 THEN UPDATE SET line.LineName = @LineName 
    WHEN NOT MATCHED THEN INSERT(LineName) VALUES(@LineName); 
    END 
    GO 

यह एक बहुत ही सरल प्रक्रिया है, मुझे पता है, लेकिन किसी कारण से यह किसी भी प्रविष्टियों उत्पन्न करने के लिए जब मैं निम्न आदेश का उपयोग नहीं लगता है।

execute moto.procPM_UpdateLines null, 'First test', 0 

क्या यह जानने का कोई तरीका है कि यह किस विकल्प का पालन कर रहा है, अगर बिल्कुल?


पिछली संग्रहीत प्रक्रिया तय की गई।

MERGE INTO moto.tblPMLine AS T 
    USING (SELECT @LineId as LineId, @LineName as LineName) AS S 
    ON T.LineId = S.LineId 
    WHEN MATCHED AND @DeleteMe = 0 THEN --UPDATE 
     UPDATE SET LineName = @LineName 
    WHEN MATCHED AND @DeleteMe = 1 THEN --DELETE 
     DELETE 
    WHEN NOT MATCHED THEN--INSERT 
     INSERT (LineName) VALUES (@LineName)  
    OUTPUT $action AS ChangesMade; 

अब यह आवेषण, अद्यतन और हटा देता है, साथ ही साथ आउटपुट लौटाता है।

+1

क्या मेरा उत्तर सुझाव नहीं है कि आपने '@ LineID' चर का उपयोग नहीं किया है? :) – shahkalpesh

+0

हाँ यह करता है, क्षमा करें। –

उत्तर

10

आप MERGE और OUTPUT खंड गठबंधन MERGE क्या कर रहा है इसकी "गतिविधि रिपोर्ट" (या डिबग "प्रिंट बयान") किसी तरह का पाने के लिए कर सकते हैं - हो सकता है कि तुम क्या गलत हो रहा है के लिए एक समझ पाने में मदद करेंगे । मोटे तौर पर कुछ -

देखें एडम Machanic उत्तम ब्लॉग पोस्ट Dr. OUTPUT or: How I Learned to Stop Worrying and Love the MERGE पता चलता है कि तकनीक और यह

उपयोग करने के लिए डाल करने के लिए कैसे मूल रूप से यह क्या हो रहा है के बारे में जानकारी प्राप्त करने के लिए MERGE बयान के साथ OUTPUT खंड का उपयोग कर करने पर निर्भर करता के साथ:

MERGE INTO ...... 
WHEN MATCHED THEN 
    ....... 
WHEN NOT MATCHED THEN 
    ...... 
WHEN NOT MATCHED BY SOURCE THEN 
    ........ 
OUTPUT 
    $action AS dml_action, 
    inserted.x AS new_x, 
    deleted.x AS old_x, 
    inserted.y AS new_y, 
    deleted.y AS old_y; 
+0

बहुत बहुत धन्यवाद, अब मुझे पता है कि कैसे। –

1
MERGE moto.tblPMLine AS line 
USING (SELECT LineId, LineName FROM moto.tblPMLine WHERE LineID = @LineID) AS existsLine 

मुझे क्षमा करें क्योंकि मैंने MERGE का उपयोग नहीं किया है। हालांकि, मुझे @LineID चर का उपयोग कर कोड नहीं दिखाई देता है।