【发布时间】:2011-08-27 10:18:17
【问题描述】:
MS SQL Server 中是否可以获取当前存储过程的名称?
也许有像GETDATE()这样的系统变量或函数?
【问题讨论】:
标签: sql-server sql-server-2008 tsql stored-procedures
MS SQL Server 中是否可以获取当前存储过程的名称?
也许有像GETDATE()这样的系统变量或函数?
【问题讨论】:
标签: sql-server sql-server-2008 tsql stored-procedures
你可以试试这个:
SELECT OBJECT_NAME(@@PROCID)
更新:此命令在 SQL Server 2016 上仍然有效。
【讨论】:
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
【讨论】:
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
返回的对象标识符(ID) 当前的 Transact-SQL 模块。一种 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)
【讨论】:
我知道这是旧的,但这是我使用的。它似乎总是有效。
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
【讨论】:
您可以在获取存储过程的架构和名称之前检查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;
【讨论】: