Параметры вывода хранимой процедуры в SQL Server Profiler - PullRequest
10 голосов
/ 04 февраля 2010

У меня есть хранимая процедура с выходным параметром int.Если я запускаю SQL Server Profiler, выполняю хранимую процедуру с помощью некоторого кода .Net и записываю событие RPC: Completed, TextData выглядит следующим образом:

declare @p1 int
set @p1=13
exec spStoredProcedure @OutParam=@p1 output
select @p1

Почему, похоже, он получает значениевыходной параметр перед выполнением хранимой процедуры?

Ответы [ 2 ]

6 голосов
/ 04 февраля 2010

Класс событий RPC: Completed указывает, что удаленный вызов процедуры завершен. Таким образом, выходной параметр на самом деле известен в этой точке. Посмотрите, показывает ли ожидание трассировку RPC: Started.

5 голосов
/ 23 января 2014

Это, как ни крути, ошибка. Цель SQL Profiler «TextData» - дать кому-то понять и повторить вызов хранимой процедуры. В этом случае выполнение этого T-SQL может дать вам совершенно другой результат, если процедура spStoredProcedure имеет какую-либо логику, зависящую от входного значения параметра @OutParam, где это значение равно "13 "были как-то значимыми в качестве входного значения.

Легко увидеть, насколько это удобно (позволяет увидеть выходные значения вызова proc, которые в противном случае должны были бы быть связаны с событием "RPC Output Parameter"), но это фактически "ложь", поскольку какой T-SQL эквивалент был выполнен.

СВЯЗАННЫЙ: я только что натолкнулся на статью команды поддержки клиентов Microsoft - о другом случае, когда преобразование RPC: BinaryData завершенного события в отображаемое значение TextData приводит к неточному воспроизведению исходного вызова RPC - на этот раз проблемы кодовой страницы:
http://blogs.msdn.com/b/psssql/archive/2008/01/24/how-it-works-conversion-of-a-varchar-rpc-parameter-to-text-from-a-trace-trc-capture.aspx

ОБНОВЛЕНО: Экспериментируя с этим, я обнаружил еще одну особенность поведения - профилировщик будет использовать этот неправильный начальный SET только в том случае, если входное значение для этого параметра в вызове RPC было Null. Если было указано ненулевое значение (а параметр в .Net SqlClient имел направление «InputOutput»), то этот начальный SET содержит истинное входное значение, а не результирующее выходное значение. Но если вход был нулевым, то вместо него устанавливается выходное значение. Это наблюдение подтверждает идею о том, что это просто ошибка обработки нуля при преобразовании отображения RPC в TSQL профилировщика.

...