如何通过SQL Server系统视图在触发器中获取当前执行SQL语句的完整文本?

2026-04-24 16:270阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计994个文字,预计阅读时间需要4分钟。

如何通过SQL Server系统视图在触发器中获取当前执行SQL语句的完整文本?

在触发器中直接调用DBCC INPUTBUFFER(@@SPID)通常返回的是触发器自身的定义(例如:

真正能稳定获取原始语句的路径,是结合 sys.dm_exec_requestssys.dm_exec_sql_text,但必须在触发器内立即抓取——稍晚一点就可能查不到对应记录。

  • 触发器中需用 @@SPID 获取当前会话 ID
  • 必须立刻查 sys.dm_exec_requestsstatus = 'running'session_id = @@SPID 的那条请求(注意:INSERT/UPDATE/DELETE 触发时,该请求可能已转为 suspended,所以建议放宽条件为 status IN ('running', 'suspended')
  • 拿到 sql_handle 后,再用 sys.dm_exec_sql_text 解析出文本;若返回 NULL,说明句柄已失效,基本无解

触发器中调用sys.dm_exec_sql_text要加WITH (NOLOCK)

不加提示容易阻塞或被阻塞:触发器本身在事务中运行,而 sys.dm_exec_sql_text 底层依赖内部缓存结构,高并发下可能因锁等待超时或死锁失败。加上 WITH (NOLOCK) 是事实上的必需操作。

阅读全文
标签:sql语句

本文共计994个文字,预计阅读时间需要4分钟。

如何通过SQL Server系统视图在触发器中获取当前执行SQL语句的完整文本?

在触发器中直接调用DBCC INPUTBUFFER(@@SPID)通常返回的是触发器自身的定义(例如:

真正能稳定获取原始语句的路径,是结合 sys.dm_exec_requestssys.dm_exec_sql_text,但必须在触发器内立即抓取——稍晚一点就可能查不到对应记录。

  • 触发器中需用 @@SPID 获取当前会话 ID
  • 必须立刻查 sys.dm_exec_requestsstatus = 'running'session_id = @@SPID 的那条请求(注意:INSERT/UPDATE/DELETE 触发时,该请求可能已转为 suspended,所以建议放宽条件为 status IN ('running', 'suspended')
  • 拿到 sql_handle 后,再用 sys.dm_exec_sql_text 解析出文本;若返回 NULL,说明句柄已失效,基本无解

触发器中调用sys.dm_exec_sql_text要加WITH (NOLOCK)

不加提示容易阻塞或被阻塞:触发器本身在事务中运行,而 sys.dm_exec_sql_text 底层依赖内部缓存结构,高并发下可能因锁等待超时或死锁失败。加上 WITH (NOLOCK) 是事实上的必需操作。

阅读全文
标签:sql语句