Ja, es ist möglich, den laufenden Code mithilfe der Systemfunktion @@ procid zu identifizieren und besser OBJECT_NAME (@@ PROCID), um den vollständigen Namen zu erhalten.
Definition: Gibt die Objektkennung (ID) des aktuellen Transact-SQL-Moduls zurück. Ein Transact-SQL-Modul kann eine gespeicherte Prozedur, eine benutzerdefinierte Funktion oder ein Trigger sein. Datenzugriffsprovider verarbeiten. "
Sie können darüber lesen Sie hier .
Eine andere Möglichkeit wäre, den SQL-Plan der aktuellen Spid zu überprüfen und diese Informationen in einer Protokollierungstabelle zu speichern. Eine Beispielabfrage, die in jedem Verfahren zum Speichern von Überwachungsdaten verwendet wird, lautet:
select sp.hostname, sp.program_name, sp.loginame,
st.text as query_text
from sysprocesses sp
cross apply sys.dm_exec_sql_text(sp.sql_handle) as st
where sp.spid = @@spid
Vielleicht gibt es dort zu viele Details ... aber ich glaube, dass Sie auf die Idee kommen.
Eine dritte Möglichkeit wäre, die context_info- Informationen für die aktuelle SP-Sitzung zu verwenden. Und verknüpfen Sie die dort gespeicherten Kontextinformationen mit jeder Prozedur. In procedure1 schreiben Sie beispielsweise 111 in den Kontext, in procedure2 schreiben Sie 222 .. und so weiter.
Weitere Informationen zu context_info finden Sie in dieser SO-Frage .
OBJECT_NAME(@@PROCID)
der Triggername zurückgegeben, nicht der aufrufende Prozess.Ich wollte das auch tun. Danke für die Antwort. Da ich immer noch hier bin, werde ich meinen Test posten, um anderen Zeit zu sparen :)
quelle
XEvents bieten eine weitere Möglichkeit, einen T-SQL-Stapel zu ermitteln, obwohl SQL Server 2008 einen verwendeten Ereignistyp möglicherweise nicht unterstützt. Die Lösung besteht aus einem Trigger, einem Fehler und einer XEvent-Sitzung. Ich habe Jim Browns Beispiel genommen, um zu zeigen, wie es funktioniert.
Zunächst habe ich die Lösung für SQL Server 2016 SP2CU2 Dev Edition getestet. SQL Server 2008 unterstützt einige EXevent, aber ich habe keine Instanz, so dass ich es nicht testen konnte.
Die Idee ist, einen Benutzerfehler in einem Dummy-Try-Catch-Block zu generieren und den Fehler dann in einer XEvent-Sitzung mit
tsql_stack
action abzufangen .SQLSERVER.error_reported
Der XEvent-Typ kann alle Fehler abfangen, obwohl sie von einem Try-Catch-Block abgefangen werden. Am Endesys.dm_exec_sql_text
extrahieren Sie T-SQL-Abfragen aus den Abfrage-Handles, die dietsql_stack
Aktion gibt.Ein Beispiel aus der Antwort von Jim Brown, die ich entwickelt habe, ist unten dargestellt. Ein Trigger löst den Fehler mit dem Text 'catch me' aus. Die XEvent-Sitzung fängt Fehler nur mit dem Text 'catch me' ab.
Wenn Sie nun die XEvent-Sitzung starten (SSMS, Objekt-Explorer, Verwaltung, Erweiterte Ereignisse, Sitzungen, catch_insertion_into_Test), usp_RootProcIDTest ausführen und den Ringpuffer der XEvent-Sitzung prüfen, sollte das XML angezeigt werden, aus dem der Knoten besteht
<action name="tsql_stack" package="sqlserver">
. Es gibt eine Folge von Rahmenknoten.handle
Fügen Sie die Werte des Attributs von a in die Systemfunktion 'sys.dm_exec_sql_text' ein und gehen Sie wie folgt vor:Mit XEvent können Sie noch viel mehr tun! Verpassen Sie nicht die Gelegenheit, sie zu lernen!
quelle