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