如何通过SQL Server系统视图在触发器中获取当前执行SQL语句的完整文本?
- 内容介绍
- 文章标签
- 相关推荐
本文共计994个文字,预计阅读时间需要4分钟。
在触发器中直接调用DBCC INPUTBUFFER(@@SPID)通常返回的是触发器自身的定义(例如:
真正能稳定获取原始语句的路径,是结合 sys.dm_exec_requests 和 sys.dm_exec_sql_text,但必须在触发器内立即抓取——稍晚一点就可能查不到对应记录。
- 触发器中需用
@@SPID获取当前会话 ID - 必须立刻查
sys.dm_exec_requests中status = '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) 是事实上的必需操作。
本文共计994个文字,预计阅读时间需要4分钟。
在触发器中直接调用DBCC INPUTBUFFER(@@SPID)通常返回的是触发器自身的定义(例如:
真正能稳定获取原始语句的路径,是结合 sys.dm_exec_requests 和 sys.dm_exec_sql_text,但必须在触发器内立即抓取——稍晚一点就可能查不到对应记录。
- 触发器中需用
@@SPID获取当前会话 ID - 必须立刻查
sys.dm_exec_requests中status = '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) 是事实上的必需操作。

