【问题标题】:What is the return value of @@ProcId in an ad-hoc SQL query?即席 SQL 查询中@@ProcId 的返回值是多少?
【发布时间】: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 masterselect @@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


【解决方案1】:

虽然没有记录,但该值对应于缓存查询计划的objectid 属性,由sys.dm_exec_plan_attributes 返回。 的意思是documented:“对于“Adhoc”或“Prepared”类型的计划,它是批处理文本的内部散列。”

为了确认,以下查询返回查询本身的文本(因此作为 SQL Server 的quine 形式,尽管它在检查运行时值时作弊):

SELECT t.[text] 
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

【讨论】:

    【解决方案2】:

    这取决于您使用什么工具来提交命令。许多工具将创建一个包含您的命令的临时存储过程(例如使用 ODBC 准备语句),然后运行该过程。

    推测,可能是该工具检测到该语句未更改,因此重新使用了先前准备好的语句。在这种情况下,将不涉及 SQL 服务器,它将是客户端库。

    或者,可能是服务器检测到 sql 未更改,而保留的 procid 是查询计划缓存系统的结果。 (SQL Server 尝试检测重复的 ad-hoc 语句并通过重用它们的计划进行优化。)

    无论哪种方式,您都应该认为这是一种好奇心,而不是您应该依赖于正确运行系统的东西,因为它可能会随着 SQL Server 或您的客户端库的更新而改变。

    【讨论】:

    • 我是直接从 SSMS 运行查询,所以听起来像是计划缓存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多