2016-07-27 7 views
1

Ist es möglich, einer Variablen einen Wert zuzuweisen, ihn an einen gespeicherten Proc zu übergeben und dann innerhalb des gespeicherten proc: 1.) den übergebenen Wert zu verwenden, 2.) den der Variablen zugewiesenen Wert zu ändern, und 3..) die Variable zurückgeben?Übergeben einer Variablen an SQL-gespeicherte Prozedur ByRef?

Ich versuche einen "Time Hack" zu erstellen, den ich in Prozeduren durchsetzen kann, um zu überprüfen, welche Anweisungen langsam ausgeführt werden. Unten ist ein Beispiel für die Prozedur und ein Aufruf an sie.

CREATE PROC [dbo].[usp_TIME_HACK_TEST] 
    @TITLE VARCHAR(255), 
    @START_TIME DATETIME OUT 
AS 
BEGIN 
    PRINT @TITLE + ': ' + RIGHT(CONVERT(VARCHAR(50),GETDATE() - @START_TIME,13),12) 
    SET @START_TIME = GETDATE() 
END 
GO 

DECLARE @x int = 0 
DECLARE @T DATETIME = GETDATE() 
Print '@T Value at Beginning: ' + convert(VARCHAR(50),@T,21) 
WHILE @x < 1000000 
    SET @x += 1 
EXEC usp_TIME_HACK_TEST 
    @TITLE = 'Test Run', 
    @START_TIME = @T 
Print '@T Value at End: ' + convert(VARCHAR(50),@T,21) 

So sieht das Ergebnis aus. Es sieht so aus, als ob @START_TIME als Eingabevariable behandelt wurde und die Prozedur den Wert von @T nicht geändert hat. Warum ist das passiert, wenn die Variable als Ausgabevariable deklariert wurde?

@T Value at Beginning: 2016-07-27 11:21:19.720 
Test Run: 00:00:00:607 
@T Value at End: 2016-07-27 11:21:19.720 

Vielen Dank im Voraus für jede Hilfe.

Antwort

2

Sie benötigen OUT[PUT] im aufrufenden Code auch.

EXEC dbo.usp_TIME_HACK_TEST 
    @TITLE = 'Test Run', 
    @START_TIME = @T OUTPUT 

BTW: In Bezug auf Ihr erklärtes Ziel, gibt es in DMVs gebaut that can be queried bereits Informationen über lange Lauf Aussagen zu bekommen, keine Notwendigkeit, das Rad neu zu erfinden ...

+0

Yup. dummer Fehler. Ich hatte das noch nie zuvor versucht und dachte, dass die Idee vielleicht falsch war. Vielen Dank für die schnelle Antwort! – JBStovers

+0

Niemals zuvor DMVs verwendet. Sieht nach einer ganzen Welt aus, die mich eine Weile brauchen würde, um sie zu verstehen. Würde 'sys.dm_exec_query_stats' die gesuchte sein? – JBStovers

+0

Ja, auch 'sys.dm_exec_procedure_stats' für eine höhere Stufe pro Prozedur-Statistik. –