Чи можливо записувати вхідні значення параметрів у виклик процедури під час відстеження в Profiler SQL Server?


13

Використовуючи SQL Server Profiler (я на SQL Server 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 рядки налагодження-printfs" всередині мого SQL чи можу я скинути всі значення параметрів виклику процедури, виконуючи SQL-трасування?

Коли я отримую слід прямо зараз, я отримую такий результат:

EXEC  @ConsiderItem = InnerProcedureCallWithinLoop  @from_locn,        
                        @About53ParmsOmitted

Те , що я хотів би знати, що @from_locn = 1і @About53ParmsOmitted = 'hello world'і так далі.

Це не вказує мені фактичне значення параметра @from_locn. У випадку цього першого параметра він передається моїй збереженій процедурі верхнього рівня, тому я знаю, що це 0, або 1, залежно від випадку. Однак приблизно 40 із 43 парам в цій внутрішній процедурі походять від FETCH NEXT FROM aCursorоперації всередині WHILEциклу.

Наразі трасування говорить мені, скільки разів InnerProcedureCallWithinLoopвикликається і скільки часу займає кожен, але не те, якими були значення параметрів для цього виклику. Якби я міг якось отримати "запущені автономні сценарії SQL", які повторюють якийсь кутовий випадок, який я знаходжу в своєму коді, прослідковуючи ці сценарії, встановлюючи ці грубі функції (я знаю, 54 параметри, це справді грубо, але я не писав їх!) може зайняти мені годину введення тексту, щоб створити сценарій SQL, який дозволяє мені самостійно викликати цей кутовий випадок, поза цим великим загальним зберіганням процедур, що зберігаються на SQL Server.

Це все є частиною зусилля, щоб перейти до виразу SQL та створити сценарії, які можуть перевірити ці складні збережені процедури.

Оновлення Я знайшов варіант запису RPC "Output Param", але не варіант запису "RPC IN PARAM".


Це не лише 54 параметри, які є валовими :-) Все, що циклично викликати курсор. Це грубо :-) Ви грали з SQL Sentry's Plan Explorer? Ви можете використовувати безкоштовну версію або використовувати пробну версію повної версії, і це може допомогти вам, якщо у вас є дзвінок з усіма параметрами - sqlsentry.net/plan-explorer/sql-server-query-view.asp
Майк Уолш

Чи можете ви сказати нам, які події ви фіксуєте?
Майк Уолш

2
Єдиний раз, коли профілер ловить ці дані (я думаю), це коли ви його називаєте? Спробуйте встановити таблицю аудиту з усіма цими параметрами, і просто зробіть вставку перед тим, як зациклювати курсор?
jcolebrand

RPC: завершено показує значення параметрів, але на зовнішньому рівні.
Майк Уолш

3
+1 за запитання, як відплата за біль. Якби я міг, я ще раз поставив +1, щоб поставити запитання без пояснень.
Марк Сторі-Сміт

Відповіді:


8

Я кусаю кулю і скажу вам, що такий слід не можна встановити, оскільки це не [сприйнята] мета слідів. Я завжди робив це так:

WHILE (@@ FETCH_STATUS = 0) І
            (@ About80MoreBooleanExpressionsHere) ПОЧАК
/ * 1 * /
    - близько 700 рядків логіки, математики та if-параметра-це-то-те
    - матеріал опущений
      INSERT InnerProcedureCallWithinLoop__TraceTable
              VALUES (@from_locn, @from_locn About53PARAMSOMITTED

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

Якщо я знаю, що він коли-небудь дзвонив з одного місця. В іншому випадку я це роблю в коллі замість того, хто телефонує.

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

Це, очевидно, відрізняється від використання траси, яка здатна фіксувати події, навіть якщо вони розпочалися і ніколи не закінчилися (несправні параметри, відхилені транзакції). Якщо це ваша проблема, вам потрібно переглянути методи CLR або електронною поштою, щоб зовнішньо використовувати отриманий вихід.


Це те, що я думав.
Warren P
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.