我需要记录存储过程名称以确定正在使用哪个存储过程。
为了实现这一点,我在每个存储过程中嵌入一个insert语句来记录它的用法。
我可以在INSERT语句中硬编码SP名称,但我正在寻找一种优雅的方法来获取当前存储过程名称而不是硬编码,这主要是为了能够搜索并删除相同的代码行该项目。
我有一个名为tblUsed (ID INT, dateused date, sprocused varchar(50))
的表,并计划在每个查询中执行插入操作。
INSERT INTO [stockist].[dbo].[tblUsed]
([objectName])
VALUES
(*procname*)
我只需要获取proc的名称就可以了。
如果还有其他方法可以实现这一点,我很乐意听到它们。
提前谢谢。
答案 0 :(得分:5)
让我们从头开始看你。
要获取存储过程的名称,您需要运行OBJECT_NAME(object_id [, database_id ])
元数据功能(更多信息here)。当您在相关对象中运行此T-SQL时,您将不再需要database_id,因此您运行的代码将如下所示:
OBJECT_NAME(*object_id*)
要获取当前T-SQL模块的对象ID,您需要使用@@PROCID
元数据函数(更多信息here),为您提供以下代码:
OBJECT_NAME(@@PROCID)
在这种情况下,您的INSERT语句将如下所示:
INSERT INTO tblUsed (sprocused)
VALUES (OBJECT_NAME(@@PROCID))
如果您使用多个架构,您可能需要使用OBJECT_SCHEMA(object_id [, database_id ])
元数据功能(更多信息here)记录您使用的架构,并为您提供:
OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
在这种情况下,您的INSERT语句将如下所示:
INSERT INTO tblUsed (sprocused)
VALUES (OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID))
另一种可能的方法是在没有所有查询中不必要的插入的所有开销的情况下完成此操作是通过使用DMV(动态管理视图)这里是一个示例查询(来自this SO thread)
SELECT sc.name
, p.name
FROM sys.procedures AS p
INNER JOIN sys.schemas AS sc
ON p.[schema_id] = sc.[schema_id]
LEFT OUTER JOIN sys.dm_exec_procedure_stats AS st
ON p.[object_id] = st.[object_id]
WHERE st.[object_id] IS NULL
ORDER BY p.name;
注意:这只会提供上次重新启动SQL时的信息。
作为this question的结果,您可能希望确保在数据库中的任何其他地方都没有引用任何过程,您可以这样做:
SELECT referencing_schema_name
, referencing_entity_name
FROM sys.dm_sql_referencing_entities ('*schemaname.objectname*', 'OBJECT');