Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Recuperar dinamicamente nomes de parâmetros e valores atuais dentro do procedimento armazenado T-SQL


Estou procurando um pedaço de código padrão que eu possa inserir no procedimento que possa percorrer todos os parâmetros do proc e recuperar os valores atuais passados--

Você pode obter todos os valores passados ​​para um sp usando a consulta abaixo

Exemplo:
Tenho abaixo o proc armazenado que me dá detalhes de vendas (somente para demonstração)
alter  proc dbo.getsales
(
@salesid int
)
as
begin
select 
* from sales where [email protected]
end

Eu chamei meu sp como abaixo ..
exec  dbo.getsales 4

Agora, se eu quiser que o valor seja passado, posso usar a consulta abaixo
select top 10* from sys.dm_exec_cached_plans cp
cross apply
sys.dm_exec_text_query_plan(cp.plan_handle,default,default)
where objtype='proc'

que me mostrou abaixo como o valor do tempo de compilação

com isso dito, há muitas coisas a considerar.. podemos usar métodos xml para obter esse valor

agora o que acontece, se eu executar o mesmo proc armazenado novamente para o valor de 2 ..
<ColumnReference Column="@salesid" ParameterCompiledValue="(4)" ParameterRuntimeValue="(2)" />

Uma captura importante aqui é que os valores acima são mostrados quando eu selecionei o plano de execução para mostrar do ssms.

Mas qual será o valor no cache, vamos vê-lo usando a consulta de cache do plano acima novamente
<ColumnReference Column="@salesid" ParameterCompiledValue="(4)"/>

Ele ainda está mostrando o valor compilado, mais a coluna usecounts como 5--`o que significa que este plano foi usado 5 vezes e o parâmetro que foi passado quando o plano foi compilado inicialmente é 4.o que também significa que os valores de tempo de execução não são armazenados em cache detalhes dos planos..

Então, em resumo, você pode obter valores de tempo de execução passados ​​para o proc armazenado
  • 1.Valores que são passados ​​enquanto a instrução é compilada (
    Você pode começar a coletar essas informações ao longo do tempo e registrá-las no proc armazenado, acho que com o tempo com reinicializações do servidor, recompilações de planos, você pode obter um novo conjunto de valores de parâmetro)
  • 2. Entrar em contato com a equipe DEV também é uma boa maneira, pois eles podem fornecer uma lista total de parâmetros que podem ser passados, se este exercício for cúbico