gpt4 book ai didi

sql-server - 通过 T-SQL 访问当前执行的存储过程名称?

转载 作者:行者123 更新时间:2023-12-01 19:25:15 29 4
gpt4 key购买 nike

我需要记录存储过程名称以确定正在使用哪个存储过程。

为了实现此目的,我在每个存储过程中嵌入一条插入语句,我们必须记录它的使用情况。

我可以在 INSERT 语句中对 SP 名称进行硬编码,但我正在寻找一种优雅的方式来获取当前存储过程名称而不是硬编码,这主要是为了能够在之后搜索并删除相同的代码行项目。

我有一个名为 tblUsed (ID INT, dateused date, sprocused varchar(50)) 的表,并计划在每个查询中执行插入操作。

INSERT INTO [stockist].[dbo].[tblUsed]
([objectName])
VALUES
(*procname*)

我只需要获取进程的名称即可使其工作。

如果有任何其他方法可以实现此目的,我很乐意听到。

提前谢谢您。

最佳答案

让我们从头开始为您看一下这个问题。

要获取存储过程的名称,您需要运行 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(动态管理 View )来实现此目的,而无需在所有查询中产生不必要的插入开销,这里是一个示例查询(来自 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');

关于sql-server - 通过 T-SQL 访问当前执行的存储过程名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26336840/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com