如何查看未提交事务中执行的完整查询?已尝试Sp_who2
查看SQL Server未提交事务的完整查询语句
针对SQL Server环境,sp_who2仅能提供基础会话信息,无法直接展示未提交事务的完整查询内容,可通过以下几种方法实现需求:
方法1:联合动态管理视图(DMVs)查询
执行以下SQL,关联事务、会话与执行的SQL文本,直接获取未提交事务的完整语句:
SELECT s.session_id, t.transaction_id, t.transaction_begin_time, -- 获取事务中执行的具体语句片段 SUBSTRING(st.text, (r.statement_start_offset/2)+1, ((CASE r.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE r.statement_end_offset END - r.statement_start_offset)/2) + 1) AS executed_query, st.text AS full_query_text -- 完整SQL文本 FROM sys.dm_tran_active_transactions t JOIN sys.dm_tran_session_transactions stt ON t.transaction_id = stt.transaction_id JOIN sys.dm_exec_sessions s ON stt.session_id = s.session_id JOIN sys.dm_exec_requests r ON s.session_id = r.session_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) st WHERE t.transaction_state != 0 -- 过滤已完成的事务
方法2:使用SQL Server Profiler或Extended Events
- SQL Server Profiler:创建跟踪时勾选
Transactions类别下的Begin Transaction、Commit Transaction事件,同时关联TSQL类别下的SQL:BatchCompleted、RPC:Completed事件,通过会话ID过滤未提交事务,即可捕获完整查询。 - Extended Events:创建事件会话,包含
sqlserver.sql_statement_completed、sqlserver.transaction_begin、sqlserver.transaction_end事件,通过会话ID关联筛选未结束的事务,获取所有已执行的SQL语句。
方法3:使用DBCC INPUTBUFFER快速排查
若已知目标会话ID,可执行以下命令查看该会话最近执行的语句:
DBCC INPUTBUFFER(目标会话ID)
注意:该方法仅能返回最近一条语句,无法获取事务中所有已执行的查询,适合单会话快速排查场景。
内容的提问来源于stack exchange,提问作者semer sead
相关产品推荐
相关产品推荐

