方法一:
WITH CTE_SID ( BSID, SID, sql_handle )
AS ( SELECT blocking_session_id ,
session_id ,
sql_handle
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0
UNION ALL
SELECT A.blocking_session_id ,
A.session_id ,
A.sql_handle
FROM sys.dm_exec_requests A
JOIN CTE_SID B ON A.session_id = B.BSID
)
SELECT C.BSID ,
C.SID ,
S.login_name ,
S.host_name ,
S.status ,
S.cpu_time ,
S.memory_usage ,
S.last_request_start_time ,
S.last_request_end_time ,
S.logical_reads ,
S.row_count ,
Q.text
FROM CTE_SID C
JOIN sys.dm_exec_sessions S ON C.SID = S.session_id
CROSS APPLY sys.dm_exec_sql_text(C.sql_handle) Q
ORDER BY SID;
方法二:
USE master;
GO
DECLARE @spid INT ,
@bl INT;
DECLARE s_cur CURSOR
FOR
SELECT 0 ,
blocked
FROM ( SELECT *
FROM sysprocesses
WHERE blocked > 0
) a
WHERE NOT EXISTS ( SELECT *
FROM ( SELECT *
FROM sysprocesses
WHERE blocked > 0
) b
WHERE a.blocked = spid )
UNION
SELECT spid ,
blocked
FROM sysprocesses
WHERE blocked > 0;
OPEN s_cur;
FETCH NEXT FROM s_cur INTO @spid, @bl;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @spid = 0
SELECT '引起数据库死锁的是: ' + CAST(@bl AS VARCHAR(10))
+ '进程号,其执行的SQL语法如下';
ELSE
SELECT '进程号SPID:' + CAST(@spid AS VARCHAR(10)) + '被' + '进程号SPID:'
+ CAST(@bl AS VARCHAR(10)) + '阻塞,其当前进程执行的SQL语法如下';
DBCC INPUTBUFFER (@bl );
FETCH NEXT FROM s_cur INTO @spid, @bl;
END;
CLOSE s_cur;
DEALLOCATE s_cur;