SQL Server Profiler में अनुरेखण करते समय एक प्रक्रिया कॉल में आने वाले पैरामीटर मान रिकॉर्ड करना संभव है?


13

SQL सर्वर प्रोफाइलर (मैं SQL सर्वर 2012 पर हूं) का उपयोग करते हुए, मैं एक उपयोगी ट्रेस उत्पन्न करने की कोशिश कर रहा हूं जो पैरामीटर मानों को दिखाता है, न कि SQL को चर नामों से। संग्रहित प्रक्रिया कुछ अत्यधिक मूल्यवान परिणाम उत्पन्न करने के लिए इन्वेंटरी डेटा की सकल राशि के माध्यम से चलती है, और मैं मौजूदा व्यवहार का दस्तावेजीकरण करने की कोशिश कर रहा हूं, इसलिए मैं इसे परीक्षण कर सकता हूं, इसे ठीक से परिभाषित कर सकता हूं, और फिर इसे कुछ समझ में ला सकता हूं।

मेरे पास एक संग्रहीत कार्यविधि है जो 54-पैरामीटर उप-प्रक्रिया निष्पादित करता है, एक लूप के अंदर जहां संग्रहीत प्रक्रिया एक कर्सर बनाती है फिर थोड़ी देर लूप करती है। यहाँ एक सरल दृश्य है:

CREATE PROCEDURE 
   [dbo].[OuterProcedure]       
   (  @ProductCode varchar(8),          
     -- 41 more parameters omitted
   )
AS            
  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED   
  SET NOCOUNT ON           
 DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations.
 -- OMIT ABOUT 10 temporary table declarations.
 DECLARE  aCursor CURSOR FAST_FORWARD FOR         
   SELECT [ID],bkno,  -- about 40 fields omitted.
              FROM vwVeryComplexViewThatDoesALotOfVeryBrutalJoins         
              WHERE  (about_80_boolean_expressions AND omitted_here)
        ORDER BY some,keys,like,this

OPEN aCursor          
FETCH NEXT FROM aCursor /* Get First Record */         
    INTO @ID, @about_40_fields,.... 
WHILE (@@FETCH_STATUS = 0) AND         
          ( @About80MoreBooleanExpressionsHere)  
BEGIN   /* 1 */            
     -- about 700 lines of logic, math and if-parameter-this-then-that
     -- stuff omitted
            EXEC  @ConsiderItem = 
                      InnerProcedureCallWithinLoop
                                            @from_locn,        
                        @About53PARAMSOMITTED,
                                                ...

    FETCH NEXT FROM CurInventory /* Get Next Record */       
       INTO @ID,@MoreStuff,...    
END                   
CLOSE CurInventory          
DEALLOCATE CurInventory        

मेरे द्वारा पास किए गए सभी पैरामीटर मानों को दिखाने के लिए मुझे एक ट्रेस कैसे मिलेगा InnerProcedureCallWithinLoop? 54 पैरामीटर हैं। क्या मुझे अपनी एसक्यूएल के अंदर अनिवार्य रूप से "डिबग-प्रिंटफ की 54 लाइनें" लिखना है या क्या मैं एसक्यूएल ट्रेस करते समय किसी प्रक्रिया कॉल के सभी पैरामीटर मानों को डंप कर सकता हूं?

जब मुझे अभी एक ट्रेस मिलता है, तो मुझे यह आउटपुट मिलता है:

EXEC  @ConsiderItem = InnerProcedureCallWithinLoop  @from_locn,        
                        @About53ParmsOmitted

क्या मैं जानना चाहते हैं वह यह है कि @from_locn = 1और @About53ParmsOmitted = 'hello world'और इतने पर।

यह मुझे पैरामीटर का वास्तविक मूल्य नहीं बताता है @from_locn। उस पहले पैरामीटर के मामले में, यह मेरे शीर्ष स्तर पर संग्रहीत प्रक्रिया में पारित हो गया है, इसलिए मुझे पता है कि यह 0, या 1 है, जैसा भी मामला हो सकता है। हालाँकि उस आंतरिक प्रक्रिया में 43 में से लगभग 40 परफॉर्म FETCH NEXT FROM aCursorएक WHILEलूप के अंदर ऑपरेशन से आते हैं ।

अभी अनुरेखण मुझे बताता है कि कितनी बार InnerProcedureCallWithinLoopआह्वान किया गया है, और प्रत्येक को कितना समय लगा, लेकिन उस कॉल के मापदंडों के मूल्य क्या नहीं थे। अगर मैं किसी भी तरह "रनएबल स्टैंडअलोन एसक्यूएल स्क्रिप्ट्स" प्राप्त कर सकता हूं, तो मैं अपने कोड के भीतर पाए जाने वाले कुछ कोने के मामले को दोहराता हूं, जबकि इन लिपियों के माध्यम से इन सकल कार्यों को स्थापित करना (मुझे पता है, 54 पैरामीटर, यह वास्तव में सकल है, लेकिन मैंने नहीं लिखा था उन्हें!) मुझे एक एसक्यूएल स्क्रिप्ट बनाने में केवल एक घंटे का समय लग सकता है, जो मुझे SQL सर्वर संग्रहीत प्रक्रियाओं के इस बड़े अभिमानी स्नार के बाहर खुद को इस कोने-केस को लागू करने देता है।

यह SQL अभिव्यक्ति के नीचे ड्रिल करने और स्क्रिप्ट बनाने का प्रयास है जो इन जटिल संग्रहीत प्रक्रियाओं की जांच कर सकता है।

अपडेट मुझे एक RPC "आउटपुट परम" रिकॉर्डिंग विकल्प मिला, लेकिन "RPC IN PARAM" रिकॉर्डिंग विकल्प नहीं।


यह सिर्फ 54 पैरामीटर नहीं है जो सकल :-) हैं जो एक कर्सर को कॉल करने के लिए लूपिंग करते हैं। यह सकल :-) क्या आपने SQL संतरी योजना एक्सप्लोरर के साथ खेला है? आप नि: शुल्क संस्करण का उपयोग करें या पूर्ण संस्करण का एक परीक्षण का उपयोग करें और यदि आप सभी मापदंडों के साथ एक फोन है कि आप मदद कर सकते हैं कर सकते हैं - sqlsentry.net/plan-explorer/sql-server-query-view.asp
माइक वाल्श

क्या आप बता सकते हैं कि आप किन घटनाओं पर कब्जा कर रहे हैं?
माइक वॉल्श

2
प्रोफाइलर को केवल उस डेटा को पकड़ा जाता है (मुझे लगता है) जब आप इसे कहते हैं? उन सभी पैरामेट्स के साथ एक ऑडिट टेबल स्थापित करने का प्रयास करें, और अपने कर्सर को लूप करने से पहले सिर्फ एक इंसर्ट करें?
jcolebrand

RPC: पूर्ण रूप से पैरामीटर मान दिखाता है लेकिन बाहरी स्तर पर।
माइक वॉल्श

3
प्रश्न के लिए +1, आपके दर्द के लिए पुनर्मिलन के रूप में। अगर मैं कर सकता था, तो मैं बिना किसी सवाल के पोस्ट करने के लिए फिर से +1 करता।
मार्क स्टोरी-स्मिथ

जवाबों:


8

मैं बुलेट को काटूंगा और आपको बताऊंगा कि ऐसा कोई निशान नहीं लगाया जा सकता है, क्योंकि यह निशान का [माना] उद्देश्य नहीं है। मैंने हमेशा इसे इस तरह किया है:

जबकि (@@ FETCH_STATUS = 0) और
            (@ About80MoreBooleanExpressionsHere)
शुरू / * 1 * /
    - तर्क, गणित के 700 लाइनों और के बारे में यदि पैरामीटर-इस-से-कि
    - सामान छोड़े गए
      सम्मिलित InnerProcedureCallWithinLoop__TraceTable
              मूल्यों (@from_locn, @ About53PARAMSOMITTED

      EXEC @ConsiderItem =
            InnerProcedureCallWithinLoop
                  @from_locn,
                        @ About53PARAMSOMITTED,
...

अगर मुझे पता है कि यह केवल एक ही स्थान से कहा जाता है। अन्यथा, मैं इसे कॉल करने वाले के बजाय कैली में करता हूं।

ALTER PROC InnerProcedureCallWithinLoop
    @from_locn int,
    @About53PARAMSOMITTED ...
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
INSERT InnerProcedureCallWithinLoop__TraceTable VALUES (@from_locn, @prm2, @prm3....
--- rest of proc

यह स्पष्ट रूप से एक ट्रेस का उपयोग करने से अलग है, जो घटनाओं को पकड़ने में सक्षम है, भले ही वे शुरू हो गए और कभी खत्म नहीं हुए (दोषपूर्ण पैरामीटर, लुढ़का हुआ लेनदेन)। यदि वह आपकी समस्या है, तो आपको कैप्चर किए गए आउटपुट को बाहरी बनाने के लिए सीएलआर या ईमेल के तरीकों को देखने की जरूरत है।


बिल्कुल यही मैने सोचा।
वॉरेन पी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.