এসকিউএল সার্ভার প্রোফাইলার ব্যবহার করে (আমি এসকিউএল সার্ভার ২০১২ তে আছি), আমি একটি কার্যকর ট্রেস উত্পন্ন করার চেষ্টা করছি যা কেবলমাত্র ভেরিয়েবল নামের এসকিউএল নয়, প্যারামিটার মানগুলি দেখায়। সঞ্চিত পদ্ধতিটি কয়েকটি অত্যন্ত মূল্যবান ফলাফল উত্পন্ন করার জন্য সামগ্রিক ইনভেন্টরি ডেটার মধ্য দিয়ে যায় এবং আমি বিদ্যমান আচরণটি নথিভুক্ত করার চেষ্টা করছি, তাই আমি এটি পরীক্ষা করে দেখতে পারি, ঠিক এটি সংজ্ঞায়িত করতে পারি এবং তারপরে এটি সংবেদনশীল কিছুতে রিফ্যাক্টর করতে পারি।
আমার কাছে একটি সঞ্চিত প্রক্রিয়া রয়েছে যা একটি 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 পরামিতি, এটি সত্যিই স্থূল, তবে আমি লিখিনি) তাদের!) এসকিউএল সার্ভারের সঞ্চিত প্রক্রিয়াগুলির এই বড় গ্যারান্টুয়ান স্ন্যারেলের বাইরে, আমাকে নিজেই এই কর্নার-কেসটি শুরু করতে দেয় এমন এসকিউএল স্ক্রিপ্ট তৈরি করতে আমাকে টাইপ করতে এক ঘন্টা সময় নিতে পারে।
এটি কোনও এসকিউএল এক্সপ্রেশনটিতে ড্রিল করার এবং স্ক্রিপ্টগুলি তৈরি করার এই চেষ্টার অংশ যা এই জটিল সঞ্চিত প্রক্রিয়াগুলির তদন্ত করতে পারে।
আপডেট আমি একটি আরপিসির "আউটপুট পরম" রেকর্ডিং বিকল্পটি পেয়েছি, তবে "আরপিসি ইন পারাম" রেকর্ডিং বিকল্পটি পাইনি।