Apakah mungkin untuk mencatat nilai parameter yang masuk dalam panggilan prosedur saat melacak di SQL Server Profiler?

13

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 = 1dan @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 aCursoroperasi di dalam sebuah WHILEloop.

Saat ini penelusuran memberi tahu saya Berapa kali InnerProcedureCallWithinLoopdipanggil, 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".

Warren P
sumber
Bukan hanya 54 parameter yang kotor :-) Semua perulangan untuk memanggil kursor. Itu menjijikkan :-) Sudahkah Anda bermain dengan Plan Penjelajah SQL Sentry? Anda dapat menggunakan versi gratis atau menggunakan uji coba versi lengkap dan itu dapat membantu Anda jika Anda memiliki panggilan dengan semua parameter - sqlsentry.net/plan-explorer/sql-server-query-view.asp
Mike Walsh
Bisakah Anda memberi tahu kami acara apa yang Anda tangkap?
Mike Walsh
2
Satu-satunya waktu profiler menangkap data itu (saya pikir) adalah ketika Anda menyebutnya? Coba atur tabel audit dengan semua param itu, dan lakukan saja penyisipan sebelum mengulang kursor Anda?
jcolebrand
RPC: Selesai menunjukkan nilai parameter tetapi di tingkat luar.
Mike Walsh
3
+1 untuk pertanyaan, sebagai balasan atas rasa sakit Anda. Jika saya bisa, saya akan memberi +1 lagi untuk memposting pertanyaan tanpa kata-kata kasar.
Mark Storey-Smith

Jawaban:

8

Saya akan menggigit peluru dan memberi tahu Anda bahwa jejak semacam itu tidak dapat diatur, karena itu bukan tujuan jejak [yang dirasakan]. Saya selalu melakukannya dengan cara ini:

WHILE (@@ FETCH_STATUS = 0) AND
            (@ About80MoreBooleanExpressionsHere)
BEGIN / * 1 * /
    - sekitar 700 baris logika, matematika dan jika-parameter-ini-itu-
    hal-hal dihilangkan
      INSERT InnerProcedureCallWithinLoop__TraceTable
              VALUES (@from_locn, @ @ About53PARAMSOMITTED

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

Jika saya tahu itu hanya dipanggil dari satu lokasi. Kalau tidak, saya melakukannya di callee alih-alih penelepon.

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

Ini jelas berbeda dari menggunakan jejak, yang mampu menangkap peristiwa bahkan jika mereka memulai dan tidak pernah selesai (parameter yang salah, transaksi yang dibatalkan). Jika itu masalah Anda, Anda perlu melihat CLR atau metode email untuk mengeksternalkan output yang ditangkap.

孔夫子
sumber
Itulah yang saya pikir.
Warren P