8 Stimmen

Kann eine SQL Server gespeicherte Prozedur den Namen ihrer übergeordneten Prozedur bestimmen?

Wenn Proc A Proc B ausführt, gibt es eine Möglichkeit für Proc B, nachzuschlagen, dass es von A aufgerufen wurde, anstatt dass A B seine ID übergibt?

Auf Anfrage: Der Grund, warum mich das interessiert, ist vielfältig 1) Allgemeines Wissen, ich bin sicher, wenn es möglich ist, würde es die clevere Verwendung einiger Systemtabellen/Variablen beinhalten, die mir helfen können, andere Dinge in Zukunft zu tun.

2) Wie andere bereits erwähnt haben, Erfassung/Auditierung. Ich würde gerne eine Prozedur erstellen, die einen Beginn, ein Ende und eine Nachrichteneingabe protokolliert, die keine Parameter erfordert und einen optionalen Parameter für eine benutzerdefinierte Nachricht akzeptiert. Dies würde es ermöglichen, einfach ein Exec am Anfang und Ende einer Prozedur fallen zu lassen, um es zu aktivieren und die Auditierungsprozedur würde den Rest automatisch herausfinden.

Ich weiß, dass diese Informationen in den Protokolldateien verfügbar sind, aber das Parsen und Bereitstellen dieser Informationen für Benutzer ist nicht ganz so einfach, während dies einen einfachen Zugriff auf diese Grundinformationen ermöglichen würde.

3) In Verbindung mit einem Semaphor könnte eine solche verallgemeinerte Prozedur sicherstellen, dass verwandte Prozesse unabhängig von Sitzungen/Transaktionen usw. nicht gleichzeitig ausgeführt werden.

5voto

KM. Punkte 98297

Verwenden Sie einen Parameter wie folgt:

CREATE PROCEDURE ParentProcedure

AS

DECLARE @ProcID             int

SET @ProcID=@@PROCID

EXEC ChildProcedure @ProcID

RETURN 0
go

und das...

CREATE PROCEDURE ChildProcedure
(
@ProcID   int=null --optional
)
AS

if @ProcID IS NOT NULL
BEGIN
    PRINT 'aufgerufen von '+OBJECT_NAME(@ProcID)
END

RETURN 0
go

1voto

AdaTheDev Punkte 135097

Nein, es kann nicht sagen, welcher gespeicherter Prozedur es aufgerufen hat. Sie müssten einen zusätzlichen Parameter hinzufügen, um ihm mitzuteilen, wer der Aufrufer ist

0voto

shahkalpesh Punkte 32505

Warum würdest du das tun wollen?
Soweit ich weiß, gibt es keinen Weg für Proz B zu wissen, wer es aufgerufen hat.

EDIT: Da KM zeigt, dass es möglich ist (gemäß dem Code), bin ich daran interessiert, den Grund dafür zu verstehen. Kannst du das auch posten, indem du es zu deiner Frage hinzufügst?

0voto

John Saunders Punkte 159011

Wenn eine gespeicherte Prozedur je nach Aufrufer unterschiedlich ablaufen soll, muss sie einen Parameter hinzufügen. Auf diese Weise funktioniert der Code immer noch, wenn Sie die gespeicherte Prozedur "Z" hinzufügen - "Z" kann den Parameter genauso übergeben wie es "C" getan hat, oder wie es "D" getan hat. Wenn das nicht ausreicht, muss neue Logik in "B" hinzugefügt werden.

0voto

Alex_L Punkte 2628

In MSSQL Server 2008 können Sie sys.dm_exec_procedures_stats verwenden, um dynamisches Management anzuzeigen und wann die gespeicherte Prozedur ausgeführt wurde (siehe auch sys.procedures, um den Namen der Prozedur zu erhalten).

SELECT s.*, d.*
FROM sys.procedures s
INNER JOIN sys.dm_exec_procedure_stats d
ON s.object_id = d.object_id
ORDER BY [d.last_execution_time] DESC;

Die übergeordnete Prozedur wird in diesem Ergebnis sehr nah angezeigt, da diese Prozedur zuvor ausgeführt wurde. Natürlich ist dies keine vollständige Lösung Ihres Problems, aber Sie können einige Informationen erhalten.

Und ja, wenn es gleichzeitige Ausführungen gibt, funktioniert diese Lösung nicht. Es kann nur bei der Entwicklung oder beim Debuggen helfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X