sql >> Database >  >> RDS >> Sqlserver

Dynamisch ophalen van parameternamen en huidige waarden in T-SQL opgeslagen procedure

Ik ben op zoek naar een standaard stuk code dat ik in de procedure kan steken en die alle parameters voor de procedure kan doorlopen en de huidige waarden kan ophalen die zijn doorgegeven in--

U kunt alle waarden voor een sp doorgeven met de onderstaande query

Voorbeeld:
Ik heb onderstaande opgeslagen procedure die me verkoopdetails geeft (alleen voor demo)

alter  proc dbo.getsales
(
@salesid int
)
as
begin
select 
* from sales where [email protected]
end

Ik heb mijn sp genoemd zoals hieronder..

exec  dbo.getsales 4

Als ik nu waarde wil doorgeven, kan ik onderstaande query gebruiken

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'

die me hieronder liet zien als de waarde voor de compileertijd

dat gezegd hebbende, er zijn veel dingen om te overwegen ... we kunnen xml-methoden gebruiken om deze waarde te krijgen

wat gebeurt er nu, als ik hetzelfde opgeslagen proces opnieuw uitvoer voor een waarde van 2 ..

<ColumnReference Column="@salesid" ParameterCompiledValue="(4)" ParameterRuntimeValue="(2)" />

Een belangrijke vangst hier is dat de bovenstaande waarden worden weergegeven wanneer ik het uitvoeringsplan selecteerde om te tonen vanuit sms.

Maar wat zal de waarde in de cache zijn, laten we het opnieuw bekijken met de bovenstaande cachequery van het plan

<ColumnReference Column="@salesid" ParameterCompiledValue="(4)"/>

Het toont nog steeds de gecompileerde waarde, plus de kolom usecounts als 5--'wat betekent dat dit plan 5 keer is gebruikt en de parameter die is doorgegeven toen het plan in eerste instantie werd gecompileerd, is 4. wat ook betekent dat runtime-waarden niet in de cache worden opgeslagen plannen details..

Kortom, u kunt runtime-waarden doorgeven aan het opgeslagen proces

  • 1. Waarden die worden doorgegeven terwijl de instructie wordt gecompileerd (
    Je kunt deze informatie in de loop van de tijd verzamelen en ze loggen tegen de opgeslagen procedure, ik denk dat na verloop van tijd met het opnieuw opstarten van de server, hercompilaties plannen, je een nieuwe set kunt krijgen van parameterwaarden)
  • 2.Contact opnemen met het DEV-team is ook een goede manier, omdat ze u een totale lijst van parameters kunnen geven die kunnen worden doorgegeven, als deze oefening lastig is


  1. MySql-veldgrootte voor het opslaan van de hoofdtekst van e-mail

  2. JAVA MySQL-verbindingsklasse niet gevonden uitzondering

  3. Verander de naam van Laravel's created_at en updated_at

  4. importeer mijn databaseverbinding met python