Имя текущей выполняющейся процедуры

95

Можно ли получить имя текущей хранимой процедуры в MS SQL Server?

Может есть системная переменная или функция вроде GETDATE()?

Сергей Метлов
источник

Ответы:

145

Вы можете попробовать это:

SELECT OBJECT_NAME(@@PROCID)

Обновление: эта команда все еще действительна в SQL Server 2016.

Алиреза Мадда
источник
4
Стоит отметить, что возвращаемое значение имеет тип SYSNAME.
Buggieboy
что делать для функции не процедуры? любая идея? Пожалуйста, помогите
Vinay Sinha
1
Все еще актуально на SQL Serve 2012
Pimenta
2
По-прежнему действует на SQL Server 2016
Fka 05
Не работает для сеанса или глобальных временных хранимых процедур.
ajeh
81
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
Картик
источник
3
Если вы используете это внутри временного процесса, он возвращает NULL, с или без получения имени схемы. 1-й процесс "нормальный", 2-й - временный, в этом коде: 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

Вы можете использовать OBJECT_NAME (@@ PROCID)

Возвращает идентификатор объекта (ID) текущего модуля Transact-SQL. Модуль Transact-SQL может быть хранимой процедурой, пользовательской функцией или триггером.

джемы
источник
6

В конкретном случае, когда вас интересует имя выполняемой в данный момент временной хранимой процедуры, вы можете получить его через:

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

Вы не можете использовать принятый ответ в SQL Server, чтобы найти имя выполняющейся в данный момент временной хранимой процедуры:

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


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

(1 row affected)
Аджех
источник
Могу подтвердить, протестировано в Enterprise 2014 в режиме совместимости 2008R2 с областью действия сеанса (двойной ##)
Elaskanator
1
помимо того, что это правильно: кто бы создавал временные процедуры ?? :-D
Тарек Салха
0

Вы можете проверить NULLперед получением схемы и имени хранимой процедуры.

Это означает, что вы можете получить нужные данные даже для (глобальных) временных хранимых процедур (щелкните изображение, чтобы увеличить):

имена невременных, временных и глобальных временных хранимых процедур

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
источник