是否可以获取 MS SQL Server 中当前存储过程的名称?
也许有像
GETDATE()
这样的系统变量或函数?
你可以试试这个:
SELECT OBJECT_NAME(@@PROCID)
更新:此命令在 SQL Server 2022 上仍然有效。
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
返回对象标识符 (ID) 当前的 Transact-SQL 模块。 A Transact-SQL 模块可以是一个存储的 过程、用户定义的函数或 触发。
在您对当前执行的临时存储过程的名称感兴趣的特定情况下,您可以通过以下方式获取:
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)
在获取存储过程的架构和名称之前,您可以检查
NULL
架构:
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;
这意味着即使对于(全局)临时存储过程,您也可以获得正确的数据(单击图像放大):
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;
我知道这很旧,但这是我用的。它似乎总是有效。
BEGIN TRAN
GO
-- Stored procedure, function of trigger
CREATE PROC dbo.TempProc AS
DECLARE @DATETIME = GETDATE()
,@Me VARCHAR(64) = COALESCE (
OBJECT_SCHEMA_NAME(@@PROCID, DB_ID())
,OBJECT_SCHEMA_NAME(@@PROCID, DB_ID('tempdb'))
,'session'
)
+ '.'
+ COALESCE (
OBJECT_NAME(@@PROCID, DB_ID())
,OBJECT_NAME(@@PROCID, DB_ID('tempdb'))
,'SQL'
)
SELECT ProcName = @Me
GO
EXEC dbo.TempProc
GO
ROLLBACK
GO
BEGIN TRAN
GO
-- Temp Stored procedure
CREATE PROC #TempProc AS
DECLARE @DATETIME = GETDATE()
,@Me VARCHAR(64) = COALESCE (
OBJECT_SCHEMA_NAME(@@PROCID, DB_ID())
,OBJECT_SCHEMA_NAME(@@PROCID, DB_ID('tempdb'))
,'session'
)
+ '.'
+ COALESCE (
OBJECT_NAME(@@PROCID, DB_ID())
,OBJECT_NAME(@@PROCID, DB_ID('tempdb'))
,'SQL'
)
SELECT ProcName = @Me
GO
EXEC #TempProc
GO
ROLLBACK
GO
-- SSMS or direct SQL statement
DECLARE @DATETIME = GETDATE()
,@Me VARCHAR(64) = COALESCE (
OBJECT_SCHEMA_NAME(@@PROCID, DB_ID())
,OBJECT_SCHEMA_NAME(@@PROCID, DB_ID('tempdb'))
,'session'
)
+ '.'
+ COALESCE (
OBJECT_NAME(@@PROCID, DB_ID())
,OBJECT_NAME(@@PROCID, DB_ID('tempdb'))
,'SQL'
)
SELECT ProcName = @Me