Pediram-me para identificar um problema de permissões com um procedimento armazenado. Esse procedimento armazenado se comporta de duas maneiras possíveis, dependendo de quais valores são usados para seus parâmetros.
exec ps_my_stored_procedure @a=1, @b=2, @c=3
é tratado de forma muito diferente de
exec ps_my_stored_procedure @a=5, @b=7, @c=0
Você poderia dizer que ps_my_stored_procedure
é dividido logicamente em dois processos completamente separados.
Usando dm_exec_procedure_stats
e dm_exec_query_stats
, posso encontrar o plano de execução que mostra o SQL do procedimento armazenado usado. Não consegui, no entanto, recuperar como os parâmetros foram definidos e com quais valores.
É possível usar dm_exec_procedure_stats
e dm_exec_query_stats
quaisquer outras visualizações de gerenciamento para reconstruir a execução do procedimento armazenado que mostra os valores usados para seus parâmetros.
O que eu realmente gostaria é de encontrar no cache, é a execução real do procedimento armazenado para que eu possa executá-lo como está usando EXECUTE AS LOGIN = 'someone'
para resolver os problemas de permissão
Costumo usar a seguinte consulta retirada de http://www.sommarskog.se/query-plan-mysteries.html#otherreasons para retornar os valores detectados. Outra maneira seria abrir o plano no SQL Sentry Plan Explorer e selecionar a guia de parâmetros. Tanto o método XML quanto o método do explorador de plano mostrarão os valores de tempo de execução assumindo que você está visualizando o plano de execução real.
Se você tiver o plano de execução, poderá visualizá-lo como xml e procurar valores de parâmetros compilados
Por exemplo, este é um trecho real de um plano de execução de uma das consultas em meu cache de plano:
Se seus planos forem reutilizados, ele mostrará o valor no momento da compilação.