Aktueller Name der ausführenden Prozedur

94

Ist es möglich, den Namen der aktuellen gespeicherten Prozedur in MS SQL Server abzurufen?

Vielleicht gibt es eine Systemvariable oder eine Funktion wie GETDATE()?

Sergey Metlov
quelle

Antworten:

143

Sie können dies versuchen:

SELECT OBJECT_NAME(@@PROCID)

Update: Dieser Befehl ist unter SQL Server 2016 noch gültig.

Alireza Maddah
quelle
4
Es ist erwähnenswert, dass der zurückgegebene Wert vom Typ SYSNAME ist.
Buggieboy
Was tun für Funktion nicht Prozedur? irgendeine Idee? Bitte helfen Sie
Vinay Sinha
1
Noch gültig auf SQL Serve 2012
Pimenta
2
Noch gültig auf SQL Server 2016
Fka
Funktioniert nicht für die Sitzung oder globale temporäre gespeicherte Prozeduren.
Ajeh
80
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
karthik
quelle
3
Wenn Sie dies in einem temporären Proc verwenden, wird NULL mit oder ohne Abrufen des Schemanamens zurückgegeben. 1. Prozess ist "normal", 2. ist Temp, in diesem Code: BEGIN TRAN GO CREATE PROC utility.TempProc AS SELECT OBJECT_SCHEMA_NAME(@@PROCID)+'.'+OBJECT_NAME(@@PROCID) GO EXEC utility.TempProc GO ROLLBACK GO BEGIN TRAN GO CREATE PROC utility.#TempProc AS SELECT OBJECT_SCHEMA_NAME(@@PROCID)+'.'+OBJECT_NAME(@@PROCID) GO EXEC utility.#TempProc GO ROLLBACK GO
SAinCA
15

Sie können OBJECT_NAME (@@ PROCID) verwenden.

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.

Marmeladen
quelle
6

In dem speziellen Fall, in dem Sie an dem Namen der aktuell ausgeführten temporär gespeicherten Prozedur interessiert sind , können Sie ihn erhalten über:

select name
from tempdb.sys.procedures
where object_id = @@procid

Sie können die akzeptierte Antwort in SQL Server nicht verwenden, um den Namen der aktuell ausgeführten temporären gespeicherten Prozedur zu ermitteln:

create procedure #p
as
select object_name(@@PROCID) as name
go
exec #p


name
--------------------------------------------------------------------------------------------------------------------------------
NULL

(1 row affected)
ajeh
quelle
Kann bestätigen, getestet in Enterprise 2014 im 2008R2-Kompatibilitätsmodus mit Session-Scoping (double
##
1
neben der Tatsache, dass es richtig ist: Wer würde temporäre Verfahren erstellen? :-D
Tarek Salha
0

Sie können überprüfen, ob NULL bevor Sie das Schema und den Namen der gespeicherten Prozedur abrufen.

Dies bedeutet, dass Sie auch für (globale) temporär gespeicherte Prozeduren die richtigen Daten erhalten können (klicken Sie auf das Bild, um es zu vergrößern):

Namen von nicht temporären, temporären und globalen temporären gespeicherten Prozeduren

USE [master]; --so we can test temp sprocs without cheating by being in tempdb.
GO

BEGIN TRAN;
GO

CREATE PROC dbo.NotTempProc
AS
BEGIN
    SELECT CASE
        WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
        THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
        ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
        END AS ProcName;
END
GO

EXEC dbo.NotTempProc;
GO

CREATE PROC dbo.#TempProc
AS
BEGIN
    SELECT CASE
        WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
        THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
        ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
        END AS ProcName;
END
GO

EXEC dbo.#TempProc;
GO

CREATE PROC dbo.##GlobalTempProc
AS
BEGIN
    SELECT CASE
        WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
        THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
        ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
        END AS ProcName;
END


GO

EXEC dbo.##GlobalTempProc;
GO

ROLLBACK;
Oreo
quelle