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" रिकॉर्डिंग विकल्प नहीं।