Nom de la procédure en cours d'exécution

94

Est-il possible d'obtenir le nom de la procédure stockée actuelle dans MS SQL Server?

Peut-être qu'il y a une variable système ou une fonction comme GETDATE()?

Sergey Metlov
la source

Réponses:

143

Vous pouvez essayer ceci:

SELECT OBJECT_NAME(@@PROCID)

Mise à jour: cette commande est toujours valide sur SQL Server 2016.

Alireza Maddah
la source
4
Il convient de noter que la valeur renvoyée est de type SYSNAME.
Buggieboy
que faire pour la fonction et non la procédure? une idée? S'il vous plaît aider
Vinay Sinha
1
Toujours valide sur SQL Serve 2012
Pimenta
2
Toujours valide sur SQL Server 2016
Fka
Ne fonctionne pas pour la session ou les procédures stockées temporaires globales.
ajeh
81
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
Karthik
la source
3
Si vous l'utilisez dans un Proc temporaire, il renvoie NULL, avec ou sans la récupération du nom de schéma. 1er proc est "normal", 2ème est temp, dans ce 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

Vous pouvez utiliser OBJECT_NAME (@@ PROCID)

Renvoie l'identificateur d'objet (ID) du module Transact-SQL actuel. Un module Transact-SQL peut être une procédure stockée, une fonction définie par l'utilisateur ou un déclencheur.

confitures
la source
6

Dans le cas spécifique où vous êtes intéressé par le nom de la procédure stockée temporaire en cours d'exécution , vous pouvez l'obtenir via:

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

Vous ne pouvez pas utiliser la réponse acceptée dans SQL Server pour rechercher le nom de la procédure stockée temporaire en cours d'exécution:

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


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

(1 row affected)
ajeh
la source
Peut confirmer, testé en entreprise 2014 en mode de compatibilité 2008R2 avec portée de session (double ##)
Elaskanator
1
outre le fait qu'il a raison: qui créerait des procédures temporaires ?? :-D
Tarek Salha
0

Vous pouvez vérifier NULL avant d'obtenir le schéma et le nom de la procédure stockée.

Cela signifie que vous pouvez obtenir les bonnes données même pour les procédures stockées temporaires (globales) (cliquez sur l'image pour l'agrandir):

noms des procédures stockées temporaires non temporaires, temporaires et 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
la source