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"기록 옵션을 찾았습니다.