Mit dem SQL Server Profiler (ich arbeite mit SQL Server 2012) versuche ich, eine nützliche Ablaufverfolgung zu generieren, die die Parameterwerte und nicht nur SQL mit Variablennamen anzeigt. Die gespeicherte Prozedur durchläuft eine große Menge von Inventardaten, um äußerst wertvolle Ergebnisse zu erzielen. Ich versuche, das vorhandene Verhalten zu dokumentieren, damit ich es nach einem Komponententest definieren, genau definieren und dann in etwas Vernünftiges umgestalten kann.
Ich habe eine gespeicherte Prozedur, die eine 54-Parameter-Unterprozedur ausführt, in einer Schleife, in der die gespeicherte Prozedur einen Cursor erstellt und dann eine while-Schleife ausführt. Hier ist eine vereinfachte Ansicht:
CREATE PROCEDURE
[dbo].[OuterProcedure]
( @ProductCode varchar(8),
-- 41 more parameters omitted
)
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON
DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations.
-- OMIT ABOUT 10 temporary table declarations.
DECLARE aCursor CURSOR FAST_FORWARD FOR
SELECT [ID],bkno, -- about 40 fields omitted.
FROM vwVeryComplexViewThatDoesALotOfVeryBrutalJoins
WHERE (about_80_boolean_expressions AND omitted_here)
ORDER BY some,keys,like,this
OPEN aCursor
FETCH NEXT FROM aCursor /* Get First Record */
INTO @ID, @about_40_fields,....
WHILE (@@FETCH_STATUS = 0) AND
( @About80MoreBooleanExpressionsHere)
BEGIN /* 1 */
-- about 700 lines of logic, math and if-parameter-this-then-that
-- stuff omitted
EXEC @ConsiderItem =
InnerProcedureCallWithinLoop
@from_locn,
@About53PARAMSOMITTED,
...
FETCH NEXT FROM CurInventory /* Get Next Record */
INTO @ID,@MoreStuff,...
END
CLOSE CurInventory
DEALLOCATE CurInventory
Wie erhalte ich eine Ablaufverfolgung, in der alle Parameterwerte angezeigt werden, an die übergeben wurde
InnerProcedureCallWithinLoop
? Es gibt 54 Parameter. Muss ich im Wesentlichen "54 Zeilen debug-printfs" in mein SQL schreiben, oder kann ich alle Parameterwerte eines Prozeduraufrufs sichern, während ich ein SQL-Trace wie mache?
Wenn ich gerade einen Trace erhalte, erhalte ich folgende Ausgabe:
EXEC @ConsiderItem = InnerProcedureCallWithinLoop @from_locn,
@About53ParmsOmitted
Was ich möchte wissen , ist , dass @from_locn = 1
und @About53ParmsOmitted = 'hello world'
und so weiter.
Dies sagt mir nicht den tatsächlichen Wert des Parameters @from_locn
. Im Fall dieses ersten Parameters wird er an meine gespeicherte Prozedur der obersten Ebene übergeben, sodass ich weiß, dass er 0 oder 1 ist. Ungefähr 40 der 43 Parameter in dieser inneren Prozedur stammen jedoch aus der FETCH NEXT FROM aCursor
Operation innerhalb einer WHILE
Schleife.
Im Moment sagt mir die Ablaufverfolgung, wie oft InnerProcedureCallWithinLoop
aufgerufen wurde und wie lange jeder Aufruf gedauert hat, aber nicht, welche Werte die Parameter für diesen Aufruf hatten. Wenn ich irgendwie "ausführbare eigenständige SQL-Skripte" bekommen könnte, die einen Eckfall aus meinem Code nachbilden, während ich diese Skripte durcharbeite und diese Bruttofunktionen einrichte (ich weiß, 54 Parameter, das ist wirklich grob, aber ich habe nicht geschrieben) Ich könnte eine Stunde brauchen, um ein SQL-Skript zu erstellen, mit dem ich diesen Eckfall selbst aufrufen kann, außerhalb dieses riesigen Knurrens von gespeicherten SQL Server-Prozeduren.
Dies ist Teil der Bemühungen, einen Drilldown zu einem SQL-Ausdruck durchzuführen und Skripts zu erstellen, mit denen diese komplexen gespeicherten Prozeduren überprüft werden können.
Update Ich habe eine RPC-Aufzeichnungsoption "Output Param" gefunden, aber keine "RPC IN PARAM" -Aufzeichnungsoption.