Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamisches Abrufen von Parameternamen und aktuellen Werten innerhalb der gespeicherten T-SQL-Prozedur

Ich suche nach einem Standardcode, den ich in die Prozedur stecken kann, der alle Parameter für die Prozedur durchlaufen und die aktuellen übergebenen Werte abrufen kann--

Sie können alle Werte erhalten, die für einen SP übergeben werden, indem Sie die folgende Abfrage verwenden

Beispiel:
Ich habe unten eine gespeicherte Prozedur, die mir Verkaufsdetails gibt (nur für die Demo)

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

Ich habe meinen SP wie unten genannt..

exec  dbo.getsales 4

Wenn ich nun einen Wert übergeben möchte, kann ich die folgende Abfrage verwenden

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'

was mir unten als Kompilierzeitwert angezeigt wurde

Abgesehen davon gibt es viele Dinge zu beachten. Wir können XML-Methoden verwenden, um diesen Wert zu erhalten

Was passiert nun, wenn ich dieselbe gespeicherte Prozedur erneut für den Wert 2 ausführe ..

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

Ein wichtiger Haken hier ist, dass die obigen Werte angezeigt werden, wenn ich den Ausführungsplan zum Anzeigen von ssms ausgewählt habe.

Aber was wird der Wert im Cache sein, sehen wir ihn uns noch einmal mit der obigen Plan-Cache-Abfrage an

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

Es zeigt immer noch den kompilierten Wert plus die Usecounts-Spalte als 5 an – was bedeutet, dass dieser Plan 5 Mal verwendet wurde und der Parameter, der übergeben wurde, als der Plan ursprünglich kompiliert wurde, 4 ist. Dies bedeutet auch, dass Laufzeitwerte nicht im Cache gespeichert werden Plandetails..

Zusammenfassend können Sie also Laufzeitwerte erhalten, die an die gespeicherte Prozedur

übergeben werden
  • 1.Werte, die übergeben werden, während die Anweisung kompiliert wird (
    Sie können damit beginnen, diese Informationen über einen bestimmten Zeitraum zu sammeln und sie gegen gespeicherte Prozesse zu protokollieren, ich denke, im Laufe der Zeit mit Server-Neustarts, Neukompilierungen planen, können Sie neue Sätze erhalten von Parameterwerten)
  • 2. Sich mit dem DEV-Team in Verbindung zu setzen, ist auch ein guter Weg, da es Ihnen eine vollständige Liste der Parameter geben kann, die übergeben werden können, wenn diese Übung schwierig ist