2009-08-12 15 views
26

की गणना करने का सबसे अच्छा तरीका मैं सोच रहा हूं कि एसक्यूएल सर्वर में एक मेर्ज स्टेटमेंट से कार्रवाई की गणना करने के बारे में जाने के लिए सबसे अच्छा तरीका क्या है।एसक्यूएल सर्वर 2008 मेरजेस -

तो, यानी मैं एक मेर्ज चलाता हूं जो कुछ आवेषण, कुछ अपडेट और कुछ हटा देता है, ... मैं कितना पता लगा सकता हूं, कितने अपडेट और कितने हटाते हैं।

ऐसा करने का सबसे अच्छा तरीका क्या होगा?

उत्तर

31

आप अपने मर्ज स्टेटमेंट पर एक आउटपुट क्लॉज निर्दिष्ट कर सकते हैं और MERGE के दौरान किए गए कार्यों की आउटपुट रिपोर्ट प्राप्त कर सकते हैं।

MERGE (targetTable) AS t 
USING (sourceTable) AS s 
ON t.ID = s.ID 
WHEN MATCHED THEN 
    (some statements) 
WHEN NOT MATCHED THEN 
    (some statements) 
OUTPUT 
    $action, inserted.ID 'inserted', deleted.ID 'deleted' 
; 

यह आपको प्रत्येक ऑपरेशन के लिए प्रत्येक "कार्रवाई" (सम्मिलित, अद्यतन, हटाएं) के लिए एक पंक्ति देगा। यदि यह बहुत सारे कथन हैं, तो आप @tableVar में भी आउटपुट कर सकते हैं और फिर टेबल वैरिएबल को देख सकते हैं। MERGE बयान और OUTPUT clause पर जानकारी के लिए बाहर पुस्तकें ऑनलाइन

DECLARE @tableVar TABLE (MergeAction VARCHAR(20), InsertedID INT, DeletedID INT) 

MERGE (targetTable) AS t 
USING (sourceTable) AS s 
ON t.ID = s.ID 
WHEN MATCHED THEN 
     (some statements) 
WHEN NOT MATCHED THEN 
     (some statements) 
OUTPUT 
     $action, inserted.ID 'inserted', deleted.ID 'deleted' INTO @tableVar 
; 

SELECT MergeAction, COUNT(*) 
FROM @tableVar 
GROUP BY MergeAction 

चेक।

मार्क

+0

क्या संभवतः एक समूह में ऐसा करने के लिए संभवतः एक समूह में ऐसा करना संभव है? ताकि आउटपुट बिट> आउटपुट $ ACTION, COUNT (1) $ ACTION द्वारा समूह के साथ कुछ प्रकार का होगा? – eidylon

+0

नहीं, आप यह नहीं कर सकते हैं। आप या तो बस एसएसएमएस आउटपुट विंडो में या टेबल वैरिएबल में आउटपुट कर सकते हैं - आउटपुट खंड को ओवर-स्ट्रेच न करें !! :-) –

+0

आह अच्छी तरह से ... असल में, क्या OUTPUT ने टेबल वैरिएबल, या परिणामसेट डाला है? स्रोत के रूप में (एक सबक्वायरी के रूप में) के रूप में एक SELECT कथन के अंदर एक OUTPUT खंड के साथ MERGE कथन को लपेटना संभव होगा और फिर उस बाहरी चयन को एकत्रीकरण करना होगा? ... संभव लगता है। मुझे इसके साथ खेलना पड़ सकता है। – eidylon

1

कैसे के बारे में:

INSERT YourResultsTable (action, cnt) 
SELECT action, count(*) 
FROM 
(
    MERGE (targetTable) AS t 
    USING (sourceTable) AS s 
     ON t.ID = s.ID 
    WHEN MATCHED THEN  (some statements) 
    WHEN NOT MATCHED THEN  (some statements) 
    OUTPUT $action as action, inserted.ID as ins, deleted.ID as del 
) m 
GROUP BY action; 

[संपादित करें] ठीक है, तो कोशिश:

INSERT YourResultsTable (action) 
SELECT action 
FROM 
(
    MERGE (targetTable) AS t 
    USING (sourceTable) AS s 
     ON t.ID = s.ID 
    WHEN MATCHED THEN  (some statements) 
    WHEN NOT MATCHED THEN  (some statements) 
    OUTPUT $action as action, inserted.ID as ins, deleted.ID as del 
) m; 

(और उसके बाद गिनती परिणाम)

रोब

+0

से खुश नहीं हैं तो कोई अस्थायी तालिका का उपयोग करें: संदेश 10717, स्तर 15, राज्य 1, रेखा 48 ग्रुप बाय क्लॉज की अनुमति नहीं है जब FROM खंड में नेस्टेड INSERT होता है , अद्यतन, हटाएं, या मर्ज स्टेटमेंट। –

+0

एसक्यूएल सर्वर 2008 डेवलपर संस्करण –

+0

पर परीक्षण किया गया मैंने आपके संपादन का उपयोग किया, फिर उस तालिका को लिया जिसमें आपने व्यक्तिगत कार्रवाइयों को केस-स्टेटमेंट का उपयोग करके एसयूएम-टोटल में एकत्र किया और उन परिणामों को लॉग किया। यह बहुत अच्छा काम करता है! यह बदबू आ रही है कि SQL सर्वर मुझे विलय-परिणामों को बाहरी रूप से चयन में सीधे अपने int-variables को एकत्रित करने और सेट करने के बजाय तालिका-चर में डालने के लिए मजबूर करता है। – MikeTeeVee

4

इंडिव में निकालने के लिए idual वार्स, धुरी का उपयोग कर marc_s द्वारा प्रक्रिया उत्तर पोस्ट कर सकते हैं:

declare 
     @mergeResultsTable table (MergeAction VARCHAR(20)); 

    declare 
     @insertCount int, 
     @updateCount int, 
     @deleteCount int; 

    merge ... 
    output $action into @mergeResultsTable; 

    select @insertCount = [INSERT], 
      @updateCount = [UPDATE], 
      @deleteCount = [DELETE] 
     from (select 'NOOP' MergeAction -- row for null merge into null 
      union all 
      select * from @mergeResultsTable) mergeResultsPlusEmptyRow  
    pivot (count(MergeAction) 
     for MergeAction in ([INSERT],[UPDATE],[DELETE])) 
     as mergeResultsPivot; 

संघ पंक्ति हटाया जा सकता है 'NOOP' अगर init 0 वार्स या पता है कि स्रोत या लक्ष्य तालिका> 0 पंक्तियां हैं।

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