当前执行的程序名称

时间:2011-05-17 17:08:05

标签: sql-server sql-server-2008 tsql stored-procedures

是否可以在MS SQL Server中获取当前存储过程的名称?可能有任何系统变量或函数,如GETDATE()

5 个答案:

答案 0 :(得分:122)

你可以试试这个:

SELECT OBJECT_NAME(@@PROCID)

更新:此命令在SQL Server 2016上仍然有效。

答案 1 :(得分:64)

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

答案 2 :(得分:14)

您可以使用OBJECT_NAME(@@PROCID)

  

返回对象标识符(ID)   当前的Transact-SQL模块。一个   Transact-SQL模块可以存储   过程,用户定义的函数或   触发。

答案 3 :(得分:5)

在您对当前正在执行的临时存储过程的名称感兴趣的特定情况下,您可以通过以下方式获取:

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)

答案 4 :(得分:0)

您可以在获取存储过程的模式和名称之前检查NULL

这意味着即使对于(全局)临时存储过程,您也可以获得正确的数据(单击图像放大):

names of non-temporary, temporary, and global temporary stored procedures

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;