MS / Transact-SQL存储过程可以查找自己的名称吗?

时间:2009-04-03 12:13:29

标签: sql-server tsql

存储过程中是否有任何方法可以引用自己的名称?假设我希望它打印自己的名称,但不需要对存储过程中的名称进行硬编码。是否有任何欺骗方式从程序本身获取名称或ID而不使用实际名称来查找信息?

5 个答案:

答案 0 :(得分:34)

尝试:

SELECT OBJECT_NAME(@@PROCID)

@@ PROCID返回当前SQL模块的对象ID。 OBJECT_NAME会将对象ID转换为其名称。两者都可以从SQL Server的至少版本7到2008中获得。

答案 1 :(得分:15)

您正在寻找@@ PROCID和OBJECT_NAME,即

select @procName=OBJECT_NAME(@@PROCID)

答案 2 :(得分:3)

proc / func的名称

Select OBJECT_NAME(@@PROCID);

其他有趣的东西

 Select * From sys.sysprocesses Where spid = @@SPID

答案 3 :(得分:0)

这是我编写的一些修补程序代码,针对SQL Server 2005数据库运行以与OBJECT_NAME(@@ PROCID)函数一起使用。

首先运行此部分,以创建日志表

CREATE TABLE Diagnostics_Log 
  (
   sprocName sysname,
   WhenRun  datetime,
   Comment  Varchar(160) NULL
  )

- ========================================

然后运行此T-SQL创建同一个sproc的几个版本,每次都添加一个数字后缀。

CREATE PROC dg_test_name_logging
    @Comment Varchar(160)
AS 
  declare @Sprocname sysname
  select @sprocName = OBJECT_NAME(@@PROCID)

  PRINT @@PROCID
  print @sprocname

  insert into Diagnostics_Log VALUES (@sprocname, GetDate(), @Comment)

GO

- ==========  然后运行本节

 exec dg_test_name_logging 'this is the first run'
WAITFOR DELAY '00:00:00:123'
  exec dg_test_name_logging1 'this is my second comment'
WAITFOR DELAY '00:00:00:123'
  exec dg_test_name_logging2 'yet another comment'
WAITFOR DELAY '00:00:02:123'
  exec dg_test_name_logging3 'amazing'
WAITFOR DELAY '00:00:00:123'
  exec dg_test_name_logging4 'I''ll be gobsmacked if this works'
WAITFOR DELAY '00:00:00:123'
  exec dg_test_name_logging5 'It''s ALIVE !!!'

  select * from Diagnostics_Log

在运行或访问sprocs或视图时记录可能很有用。

答案 4 :(得分:0)

object_name()本身不指定当前对象的架构。要做到这一点:

print object_schema_name(@@PROCID) + '.' + object_name(@@PROCID)