sql >> Database teknologi >  >> RDS >> Sqlserver

Hent dynamisk parameternavne og aktuelle værdier inde i T-SQL-lagret procedure

Jeg leder efter et standard stykke kode, som jeg kan stikke ind i proceduren, der kan sløjfe gennem alle parametre for processen og hente de aktuelle værdier, der er sendt i--

Du kan få alle værdier sendt ind for en sp ved at bruge nedenstående forespørgsel

Eksempel:
Jeg har nedenfor gemt proc, som giver mig salgsoplysninger (kun til demo)

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

Jeg har ringet til min sp som nedenfor..

exec  dbo.getsales 4

Hvis jeg nu ønsker at få værdi bestået, kan jeg bruge nedenstående forespørgsel

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 viste mig nedenfor som kompileringstidsværdien

med det sagt, er der mange ting at overveje.. vi kan bruge xml-metoder til at få denne værdi

Hvad sker der nu, hvis jeg kører den samme lagrede proc igen til en værdi af 2 ..

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

En vigtig fangst her er, at ovenstående værdier vises, når jeg valgte en eksekveringsplan til at vise fra ssms.

Men hvad vil værdien i cache være, lad os se det ved at bruge ovenstående cache-forespørgsel igen

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

Den viser stadig den kompilerede værdi plus usecounts-kolonnen som 5--`hvilket betyder, at denne plan er blevet brugt 5 gange, og parameteren, der blev bestået, da planen oprindeligt blev kompileret, er 4.hvilket også betyder, at køretidsværdier ikke er gemt i cachen planer detaljer..

Så sammenfattende kan du få runtime-værdier overført til lagret proc

  • 1.Værdier, der sendes, mens sætningen kompileres(
    Du kan begynde at indsamle disse oplysninger over en periode og logge dem mod lagret proc, jeg tror, ​​at du med tiden med servergenstarter, planlægger genkompileringer, kan få nyt sæt af parameterværdier)
  • 2. At komme i kontakt med DEV-teamet er også en god måde, da de kan give dig en samlet liste over parametre, der kan passeres, hvis denne øvelse er omstændelig


  1. Ændre SQL-tabel - tillad NULL-kolonneværdi

  2. Hvordan bruger man transaktioner og låse korrekt for at sikre databaseintegritet?

  3. Hvad ville der ske, hvis 2 eller flere personer forsøger at opdatere den samme MySQL-tabel på samme tid?

  4. SQL Server betinget CHECK-begrænsning