sql >> Databasteknik >  >> RDS >> Sqlserver

Hämta dynamiskt parameternamn och aktuella värden i T-SQL-lagrad procedur

Jag letar efter en standardkod som jag kan fästa i proceduren som kan gå igenom alla parametrar för processen och hämta de aktuella värdena som skickas i--

Du kan få alla värden skickade för en sp genom att använda nedanstående fråga

Exempel:
Jag har nedan lagrat proc som ger mig försäljningsinformation (endast för demo)

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

Jag har ringt min sp som nedan..

exec  dbo.getsales 4

Om jag nu vill få värdet passerat kan jag använda nedanstående fråga

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'

som visade mig nedan som kompileringstidsvärdet

med det sagt, det finns många saker att tänka på..vi kan använda xml-metoder för att få detta värde

vad händer nu, om jag kör samma lagrade proc igen för värdet 2 ..

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

En viktig hake här är att ovanstående värden visas när jag valde exekveringsplanen att visa från ssms.

Men vad blir värdet i cache, låt oss se det med hjälp av ovanstående cachefråga igen

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

Den visar fortfarande det kompilerade värdet plus usecounts-kolumnen som 5--`vilket betyder att denna plan har använts 5 gånger och parametern som skickades när planen kompilerades är 4.vilket också betyder att körtidsvärden inte lagras i cachelagret planer detaljer...

Så sammanfattningsvis kan du få körtidsvärden skickade till lagrad proc

  • 1.Värden som skickas medan satsen kompileras(
    Du kan börja samla in denna information över tid och logga dem mot lagrad proc, jag tror att med tiden med serverstarter, planera omkompilering kan du få en ny uppsättning av parametervärden)
  • 2. Att komma i kontakt med DEV-teamet är också ett bra sätt, eftersom de kan ge dig en total lista över parametrar som kan passeras, om denna övning är omständlig


  1. Vad betyder pipe/veritcal bar-tecken i TSQL?

  2. Bör PHP-utvecklare använda MySQL:s lagrade procedurer?

  3. Hur delar man upp en sträng i variabler i sql?

  4. Hanterar innoDB dödläge