2010-02-04 15 views
8

Tengo un procedimiento almacenado con un parámetro de salida int. Si me quedo Analizador de SQL Server, ejecute el procedimiento almacenado a través de un código .Net, y la captura de la RPC: finalización evento, TextData se ve así:Parámetros de salida de procedimiento almacenado en SQL Server Profiler

declare @p1 int 
set @p1=13 
exec spStoredProcedure @[email protected] output 
select @p1 

¿Por qué parece que se está haciendo el valor de la salida parámetro antes de ejecutar el procedimiento almacenado?

+0

? porque esa es la forma en que se muestra? ¿Dónde está la pregunta? –

+0

Bueno, la forma en que se muestra hace que parezca que está adivinando mágicamente el valor del parámetro de salida antes de ejecutar el procedimiento almacenado. Obviamente, esta no es la secuencia de comandos que se están ejecutando, así que me preguntaba por qué se muestra de esa manera. –

Respuesta

5

La clase de evento RPC: Completed indica que se ha completado una llamada a procedimiento remoto. Entonces el parámetro de salida es realmente conocido en ese punto. Vea si el rastreo de RPC: Iniciado le muestra lo que espera.

+0

Ok, veo, en el evento RPC: Started, la variable @ p1 se establece en NULL. Tiene sentido, supongo. –

+0

Estoy convencido de que esto es un error (y agregué una respuesta a ese efecto) - ¿tiene algún indicio de que este sea el comportamiento previsto? No pude encontrar documentación de ninguna manera. – Tao

4

Esto es, no importa cómo lo mires, un error. La intención del Analizador de SQL "TextData" es permitir que alguien comprenda y repita la llamada al procedimiento almacenado. En este caso, ejecutar este T-SQL puede darle un resultado completamente diferente, si el procedimiento spStoredProcedure tiene alguna lógica dependiente del valor de entrada del parámetro @OutParam, donde ese valor de "13" era de algún modo significativo como valor de entrada .

Es fácil ver cómo puede ser conveniente (le permite ver los valores de salida de la llamada de proceso, que de otro modo tendría que ver con el evento "Parámetro de salida RPC"), pero es efectivamente una "mentira" en cuanto a qué equivalente T-SQL se ejecutó.

RELACIONADO: Acabo de encontrar un artículo del equipo de soporte y atención al cliente de Microsoft - sobre otro caso en el que la conversión de RPC: los datos binarios del evento completados en un valor visualizable TextData da como resultado una reproducción imprecisa de la llamada RPC original problemas de página de códigos de tiempo:
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

ACTUALIZACIÓN: al experimentar con esto, he encontrado otra peculiaridad de la conducta - el generador de perfiles sólo utilizar este conjunto inicial incorrecto si el valor de entrada para ese parámetro, en la llamada RPC, era Null . Si se proporcionó un valor no nulo (y el parámetro, en .Net SqlClient, tenía la dirección "InputOutput"), entonces ese SET inicial contiene el verdadero valor de entrada, y no el valor de salida resultante. Pero si la entrada fue nula, entonces el valor de salida se establece en su lugar. Esta observación respalda la noción de que esto es simplemente un error de manejo nulo en la conversión de visualización de perfil RPC a TSQL.

Cuestiones relacionadas