SQL Server 프로파일 러에서 추적하는 동안 들어오는 매개 변수 값을 프로 시저 호출에 기록 할 수 있습니까?


13

SQL Server 프로파일 러 (SQL Server 2012에 있음)를 사용하여 변수 이름을 가진 SQL뿐만 아니라 매개 변수 값을 보여주는 유용한 추적을 생성하려고합니다. 저장 프로 시저는 엄청난 양의 인벤토리 데이터를 통해 매우 귀중한 결과를 생성하며 기존 동작을 문서화하려고하므로 단위 테스트, 정확하게 정의 한 다음 제정신으로 리팩터링 할 수 있습니다.

54 매개 변수 하위 절차를 수행하는 저장 프로 시저가 있습니다. 루프 내부에서 저장 프로 시저가 커서를 만든 다음 while 루프를 수행합니다. 단순화 된보기는 다음과 같습니다.

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 개의 매개 변수가 있습니다. SQL 내에 "54 라인의 debug-printfs"를 작성해야합니까, 아니면 SQL 추적을 수행하는 동안 프로 시저 호출의 모든 매개 변수 값을 덤프 할 수 있습니까?

지금 트레이스를 받으면 다음과 같은 결과를 얻습니다.

EXEC  @ConsiderItem = InnerProcedureCallWithinLoop  @from_locn,        
                        @About53ParmsOmitted

내가 알고 싶은 것은 즉 @from_locn = 1@About53ParmsOmitted = 'hello world'등등.

이것은 매개 변수의 실제 값을 알려주지 않습니다 @from_locn. 첫 번째 매개 변수의 경우 최상위 저장 프로 시저로 전달되므로 0 또는 1이라는 것을 알고 있습니다. 그러나 내부 절차의 43 개 매개 변수 중 약 40 개가 루프 FETCH NEXT FROM aCursor내부 작업 에서 비롯됩니다 WHILE.

지금 추적은 InnerProcedureCallWithinLoop호출 횟수 와 호출 시간을 알려주지 만 해당 호출에 대한 매개 변수의 값은 아닙니다. 어떻게 든 코드 내에서 찾은 코너 케이스를 복제하는 "실행 가능한 독립 실행 형 SQL 스크립트"를 얻을 수 있다면 이러한 스크립트를 추적하면서 이러한 총 함수를 설정하면서 (총 54 개의 매개 변수를 알고 있지만 실제로는 작성하지 않았습니다) 그들!)은 SQL 스크립트 저장 프로 시저의 거대한 거대한 snarl 외부 에서이 코너 케이스를 직접 호출 할 수있는 SQL 스크립트를 작성하는 데 한 시간 정도의 입력이 필요했습니다.

이는 SQL 표현식으로 드릴 다운하고 이러한 복잡한 저장 프로 시저를 검사 할 수있는 스크립트를 작성하려는 노력의 일부입니다.

업데이트 "RPC IN PARAM"기록 옵션이 아닌 RPC "Output Param"기록 옵션을 찾았습니다.


총 54 개의 매개 변수가 아닙니다 :-) 커서를 호출하기 위해 반복됩니다. :-) SQL Sentry의 Plan Explorer를 사용해 보셨습니까? 무료 버전을 사용하거나 정식 버전의 평가판을 사용할 수 있으며 모든 매개 변수 ( sqlsentry.net/plan-explorer/sql-server-query-view.asp)를
Mike Walsh

어떤 이벤트를 캡처하고 있는지 말씀해 주시겠습니까?
Mike Walsh

2
프로파일 러가 해당 데이터를 잡는 유일한 시간은 전화 할 때뿐입니다. 이러한 모든 매개 변수로 감사 테이블을 설정하고 커서를 반복하기 전에 삽입을 수행하십시오.
jcolebrand

RPC : Completed는 매개 변수 값을 표시하지만 외부 수준에 있습니다.
Mike Walsh

3
당신의 고통에 대한 보상으로 질문에 +1하십시오. 내가 할 수 있다면, expletives없이 질문을 게시하여 다시 +1했습니다.
Mark Storey-Smith

답변:


8

총알을 물고 추적의 목적이 아니기 때문에 그러한 추적을 설정할 수 없다고 말할 것입니다. 나는 항상 이렇게했다 :

WHILE (@@ FETCH_STATUS = 0) AND
            (@ About80MoreBooleanExpressionsHere)
BEGIN / * 1 * /
    -약 700 줄의 논리, 수학 및 if-parameter-this-       the- 그러면
    - 이것들은 생략되었습니다.
INSERT InnerProcedureCallWithinLoop__TraceTable
              VALUES (@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 또는 이메일 방법을 살펴 봐야합니다.


그것이 내가 생각했던 거죠.
워렌 P
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.