SQL Server Profiler'da izleme sırasında gelen parametre değerlerini bir yordam çağrısına kaydetmek mümkün müdür?


13

SQL Server Profiler (SQL Server 2012'deyim) kullanarak, sadece değişken adları ile SQL değil, parametre değerlerini gösteren kullanışlı bir izleme oluşturmaya çalışıyorum. Saklı yordam bazı son derece değerli sonuçlar üretmek için Brüt envanter verileri üzerinden yürür ve ben mevcut davranışı belgelemek için çalışıyorum, böylece birim test, tam olarak tanımlamak ve sonra aklı başında bir şey içine yeniden refactor.

Saklı yordam bir imleç oluşturduktan sonra bir while döngüsü yapar bir döngü içinde, 54-parametre alt yordamı yürütmek saklı bir yordam var. İşte basitleştirilmiş bir görünüm:

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        

Bana iletilen tüm parametre değerlerini gösteren bir izlemeyi nasıl alabilirim InnerProcedureCallWithinLoop? 54 parametre vardır. Temelde benim SQL "54 hata ayıklama-printfs satırları" yazmak zorunda mı yoksa bir SQL izleme yaparken nasıl bir prosedür çağrısının tüm parametre değerlerini dökümü nasıl?

Şu anda bir iz aldığımda, bu çıktıyı alıyorum:

EXEC  @ConsiderItem = InnerProcedureCallWithinLoop  @from_locn,        
                        @About53ParmsOmitted

Bilmek istediğim şey bu @from_locn = 1ve bu gibi şeyler @About53ParmsOmitted = 'hello world'.

Bu bana parametrenin gerçek değerini söylemiyor @from_locn. Bu ilk parametre durumunda, en üst düzey saklı yordamım geçirilir, bu nedenle 0 veya 1 olduğunu biliyorum. Bununla birlikte, bu iç prosedürdeki 43 parametrenin yaklaşık 40'ı FETCH NEXT FROM aCursorbir WHILEdöngü içindeki operasyondan gelir .

Şu anda izleme bana kaç kez InnerProcedureCallWithinLoopçağrıldığını ve her birinin ne kadar sürdüğünü söylüyor , ancak o çağrıya ait parametrelerin değerlerinin ne olduğunu değil. Bir şekilde kodumda bulduğum bazı köşe durumunu çoğaltan "çalıştırılabilir bağımsız SQL komut dosyaları" alabilirsem, bu komut dosyalarının izini sürerken, bu kaba işlevleri kurarken (biliyorum, 54 parametre, bu gerçekten brüt, ama yazmadım) Onları!) bana sadece bu köşe-case kendimi, SQL Server saklı yordamlar bu büyük devasa hırıltı dışında çağırmak sağlayan bir SQL komut dosyası oluşturmak için yazarak bir saat sürebilir.

Bu, bir SQL ifadesine inme ve bu karmaşık saklı yordamları inceleyebilecek komut dosyaları oluşturma çabasının bir parçasıdır.

Güncelleme Bir RPC "Output Param" kayıt seçeneği buldum, ancak bir "RPC IN PARAM" kayıt seçeneği bulamadım.


Sadece 54 parametre brüt değil :-) Tüm bu bir imleç çağırmak için döngü. Bu iğrenç :-) SQL Sentry'nin Plan Explorer ile oynadın mı? Ücretsiz sürümü kullanabilir veya tam sürümün bir deneme sürümünü kullanabilirsiniz ve tüm parametrelerle bir çağrınız varsa size yardımcı olabilir - sqlsentry.net/plan-explorer/sql-server-query-view.asp
Mike Walsh

Hangi etkinlikleri yakaladığınızı söyleyebilir misiniz?
Mike Walsh

2
Profil oluşturucunun bu verileri yakaladığı tek zaman (sanırım) onu çağırdığınızda mı? Tüm bu parametrelerle bir denetim tablosu oluşturmayı deneyin ve imlecinizi döngüye sokmadan önce bir ekleme yapın?
jcolebrand

RPC: Tamamlandı, parametre değerlerini gösterir, ancak dış düzeyde.
Mike Walsh

3
Acınız için tazminat olarak soru için +1. Yapabilseydim, soruyu kesinleştirmeden yayınladığım için tekrar + 1'leyebilirdim.
Mark Storey-Smith

Yanıtlar:


8

Mermiyi ısıracağım ve size böyle bir iz bırakılamayacağını söyleyeceğim, çünkü izlerin [algılanan] amacı değil. Her zaman böyle yaptım:

WHILE (@@ FETCH_STATUS = 0) AND
            (@ About80MoreBooleanExpressionsHere)
BEGIN / * 1 * /
    - yaklaşık 700 satırlık mantık, matematik ve if-parametresi-this-then-that
    - şeyler
      INSERT InnerProcedureCallWithinLoop__TraceTable
              DEĞERLERİ (@from_locn, @ @ Hakkında53PARAMSOMITTED

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

Ben sadece hiç bir yerden denir biliyorum. Aksi takdirde, arayan yerine callee'de yaparım.

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

Bu, olayları başlasalar ve hiç bitmemiş olsalar bile yakalayabilen bir iz kullanmaktan açıkça farklıdır (hatalı parametreler, geri alma işlemleri). Sorununuz buysa, yakalanan çıktıyı haricileştirmek için CLR veya e-posta yöntemlerine bakmanız gerekir.


Bende böyle düşünmüştüm.
Warren P
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.