【发布时间】:2020-01-02 14:15:36
【问题描述】:
我一直在研究将我们报告数据库上的程序执行记录到一个表中,并旨在提出一个通用的 sn-p 代码,它可以复制到我们想要记录的任何 proc 中。
以上内容引导我使用@@ProcID。 The Microsoft documentation 解释说,这将提供包含它的 proc、udf 或触发器的对象 ID。这是有道理的,但我也看到它在直接从新查询窗口运行时返回一个值。我无法将此整数与数据库中的对象 ID 相关联 - 我不知道此 ID 代表什么。我是我正在尝试的服务器上的系统管理员,所以不应该有任何权限限制。
我没有设法在网上找到任何关于此的信息 - 唯一看起来相关的 search result 位于登录受限的 SAP 支持论坛上。
Use Master
select @@procid -- returns an integer
select object_name(@@procid) -- NULL
select * from sys.objects where object_id = @@ProcId -- 0 rows
【问题讨论】:
-
这一点的巧妙之处在于,
use master; select @@procid也将返回与将两个命令放在不同行上不同的结果,但每次运行它时它的值也会相同。此外,use master和select @@procid之间的空白行数会改变结果。 -
没有记录;因为它与查询文本保持不变并且在没有对象被访问时不会因服务器而异(如
query_plan_hash)。 -
啊,我们走了。该值对应于
sys.dm_exec_plan_attributes返回的查询计划的objectid值,该值又记录了“对于“临时”或“准备”类型的计划,它是批处理文本的内部散列。使用它进行日志记录是不稳定的,因为该值仅在查询计划实际可用时才可用。 (试试SELECT * FROM sys.dm_exec_cached_plans p CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) t CROSS APPLY sys.dm_exec_plan_attributes(p.plan_handle) a WHERE a.attribute = 'objectid' AND a.value = @@PROCID。) -
好的,有道理 - 谢谢。我不打算将 ad-hoc 值用于任何事情,但我对它的行为感到惊讶,并且在深入了解它之前不想继续前进。如果您在下面发帖,我很乐意将其标记为答案。
标签: sql-server tsql sql-server-2016