Nazwa aktualnie wykonywanej procedury


Odpowiedzi:


145

Możesz spróbować tego:

SELECT OBJECT_NAME(@@PROCID)

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


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)

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.


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)

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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.