Параметры вывода хранимой процедуры в SQL Server Profiler

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

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

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

2 ответа

Решение

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

Это, как ни крути, ошибка. Цель 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 в профилировщике.

Другие вопросы по тегам