Nombre del procedimiento en ejecución actual

Respuestas:

143

Puedes probar esto:

SELECT OBJECT_NAME(@@PROCID)

Actualización: este comando sigue siendo válido en SQL Server 2016.

Alireza Maddah
fuente
4
Vale la pena señalar que el valor devuelto es de tipo SYSNAME.
Buggieboy
¿Qué hacer para la función, no el procedimiento? ¿alguna idea? Por favor ayuda
Vinay Sinha
1
Todavía válido en SQL Serve 2012
Pimenta
2
Sigue siendo válido en SQL Server 2016
Fka
No funciona para la sesión o los procedimientos almacenados temporales globales.
ajeh
81
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
karthik
fuente
3
Si usa esto dentro de un proceso temporal, devuelve NULL, con o sin la recuperación del nombre del esquema. El primer proceso es "normal", el segundo es la temperatura, en este código: 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

Puede utilizar OBJECT_NAME (@@ PROCID)

Devuelve el identificador de objeto (ID) del módulo Transact-SQL actual. Un módulo Transact-SQL puede ser un procedimiento almacenado, una función definida por el usuario o un disparador.

Enjambres
fuente
6

En el caso específico en el que esté interesado en el nombre del procedimiento almacenado temporal que se está ejecutando actualmente , puede obtenerlo a través de:

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

No puede usar la respuesta aceptada en SQL Server para encontrar el nombre del procedimiento almacenado temporal que se está ejecutando actualmente:

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


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

(1 row affected)
ajeh
fuente
Puede confirmar, probado en Enterprise 2014 en modo de compatibilidad 2008R2 con alcance de sesión (doble ##)
Elaskanator
1
además de que tiene razón: ¿Quién crearía procedimientos temporales? :-D
Tarek Salha
0

Puede comprobarlo NULLantes de obtener el esquema y el nombre del procedimiento almacenado.

Esto significa que puede obtener los datos correctos incluso para procedimientos almacenados temporales (globales) (haga clic en la imagen para agrandarla):

nombres de procedimientos almacenados temporales no temporales, temporales y globales

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
fuente