Nome do procedimento de execução atual


Respostas:


143

Você pode tentar isto:

SELECT OBJECT_NAME(@@PROCID)

Atualização: este comando ainda é válido no SQL Server 2016.


4
É importante notar que o valor retornado é do tipo SYSNAME.
Buggieboy

o que fazer para função, não procedimento? qualquer ideia? Por favor ajude
Vinay Sinha

1
Ainda válido no SQL Serve 2012
Pimenta

2
Ainda válido no SQL Server 2016
Fka

Não funciona para a sessão ou procedimentos armazenados temporários globais.
ajeh de

81
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)

3
Se você usar isso dentro de um Proc temp, ele retornará NULL, com ou sem a recuperação do nome do esquema. O primeiro proc é "normal", o segundo é temp, neste 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

Você pode usar OBJECT_NAME (@@ PROCID)

Retorna o identificador de objeto (ID) do módulo Transact-SQL atual. Um módulo Transact-SQL pode ser um procedimento armazenado, função definida pelo usuário ou gatilho.


6

No caso específico em que você está interessado no nome do procedimento armazenado temporário em execução no momento , você pode obtê-lo por meio de:

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

Você não pode usar a resposta aceita no SQL Server para encontrar o nome do procedimento armazenado temporário em execução no momento:

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


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

(1 row affected)

Pode confirmar, testado no Enterprise 2014 em modo de compatibilidade 2008R2 com escopo de sessão (duplo ##)
Elaskanator

1
além do fato, é certo: Quem criaria procedimentos provisórios ?? :-D
Tarek Salha

0

Você pode verificar NULL antes de obter o esquema e o nome do procedimento armazenado.

Isso significa que você pode obter os dados corretos, mesmo para procedimentos armazenados temporários (globais) (clique na imagem para aumentar):

nomes de procedimentos armazenados temporários não temporários, temporários e globais

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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.