Nazwa aktualnie wykonywanej procedury

95

Czy można uzyskać nazwę aktualnej procedury składowanej w MS SQL Server?

Może istnieje zmienna systemowa lub funkcja podobna do GETDATE()?

Siergiej Metłow
źródło

Odpowiedzi:

145

Możesz spróbować tego:

SELECT OBJECT_NAME(@@PROCID)

Aktualizacja: to polecenie jest nadal ważne w programie SQL Server 2016.

Alireza Maddah
źródło
4
Warto zauważyć, że zwracana wartość jest typu SYSNAME.
Buggieboy
co zrobić dla funkcji, a nie procedury? dowolny pomysł? Proszę o pomoc
Vinay Sinha
1
Nadal ważna na SQL Serve 2012
Pimenta
2
Nadal ważne w SQL Server 2016
Fka,
Nie działa w przypadku sesji ani globalnych tymczasowych procedur składowanych.
ajeh
81
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
karthik
źródło
3
Jeśli użyjesz tego w tymczasowym procencie, zwróci NULL, z lub bez pobierania nazwy schematu. Pierwszy proces to „normalny”, drugi to temp, w tym kodzie: 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

Możesz użyć OBJECT_NAME (@@ PROCID)

Zwraca identyfikator obiektu (ID) bieżącego modułu Transact-SQL. Moduł języka Transact-SQL może być procedurą składowaną, funkcją zdefiniowaną przez użytkownika lub wyzwalaczem.

zacina się
źródło
6

W konkretnym przypadku, gdy interesuje Cię nazwa aktualnie wykonywanej tymczasowej procedury składowanej, możesz ją uzyskać poprzez:

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

Nie można użyć zaakceptowanej odpowiedzi w SQL Server, aby znaleźć nazwę aktualnie wykonywanej tymczasowej procedury składowanej:

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


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

(1 row affected)
ajeh
źródło
Potwierdza, przetestowany w Enterprise 2014 w trybie zgodności 2008R2 z zakresem sesji (podwójne ##)
Elaskanator
1
poza tym, że słusznie: kto stworzyłby tymczasowe procedury? :-D
Tarek Salha
0

Możesz sprawdzić NULL przed pobraniem schematu i nazwy procedury składowanej.

Oznacza to, że możesz uzyskać odpowiednie dane nawet dla (globalnych) tymczasowych procedur składowanych (kliknij obraz, aby powiększyć):

nazwy nietymczasowych, tymczasowych i globalnych tymczasowych procedur składowanych

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
źródło