Menggunakan SQL Server Profiler (Saya menggunakan SQL Server 2012), saya mencoba untuk menghasilkan jejak yang berguna yang menunjukkan nilai parameter, bukan hanya SQL dengan nama variabel. Prosedur yang tersimpan berjalan melalui sejumlah besar data Inventaris untuk menghasilkan beberapa hasil yang sangat berharga, dan saya mencoba mendokumentasikan perilaku yang ada, sehingga saya dapat mengujinya, mendefinisikannya dengan tepat, dan kemudian mengubahnya menjadi sesuatu yang waras.
Saya memiliki prosedur tersimpan yang menjalankan sub-prosedur 54-parameter, di dalam loop di mana prosedur tersimpan menciptakan kursor kemudian melakukan loop sementara. Berikut tampilan yang disederhanakan:
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
Bagaimana cara saya mendapatkan jejak untuk menunjukkan semua nilai parameter yang diteruskan ke saya
InnerProcedureCallWithinLoop
? Ada 54 parameter. Apakah saya harus menulis "54 baris debug-printfs" pada dasarnya di dalam SQL saya atau dapatkah saya membuang semua nilai parameter panggilan prosedur saat melakukan pelacakan SQL?
Ketika saya mendapatkan jejak sekarang, saya mendapatkan hasil ini:
EXEC @ConsiderItem = InnerProcedureCallWithinLoop @from_locn,
@About53ParmsOmitted
Apa yang saya ingin tahu adalah bahwa @from_locn = 1
dan @About53ParmsOmitted = 'hello world'
dan sebagainya.
Ini tidak memberi tahu saya nilai aktual parameter @from_locn
. Dalam hal parameter pertama itu, diteruskan ke prosedur tersimpan tingkat atas saya, jadi saya tahu itu 0, atau 1, seperti kasusnya. Namun sekitar 40 dari 43 params dalam prosedur dalam itu berasal dari FETCH NEXT FROM aCursor
operasi di dalam sebuah WHILE
loop.
Saat ini penelusuran memberi tahu saya Berapa kali InnerProcedureCallWithinLoop
dipanggil, dan berapa lama masing-masing diperlukan, tetapi tidak seperti apa nilai parameter untuk panggilan itu. Jika saya entah bagaimana bisa mendapatkan "skrip SQL runnable standalone" yang mereplikasi beberapa kasus sudut yang saya temukan dalam kode saya, sambil menelusuri skrip ini, mengatur fungsi-fungsi kotor ini (saya tahu, 54 parameter, itu benar-benar kotor, tapi saya tidak menulis mereka!) bisa memakan waktu satu jam untuk mengetik hanya untuk membangun skrip SQL yang memungkinkan saya menjalankan kasus sudut ini sendiri, di luar geraman besar prosedur tersimpan SQL Server.
Ini semua adalah bagian dari upaya untuk menelusuri ekspresi SQL dan membuat skrip yang dapat menyelidiki prosedur tersimpan yang kompleks ini.
Pembaruan Saya menemukan opsi perekaman "Output Param" RPC, tetapi bukan opsi perekaman "RPC IN PARAM".