Використовуючи 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".