CREATE PROCEDURE #sp_who_lock |
AS |
BEGIN |
DECLARE @spid INT |
DECLARE @blk INT |
DECLARE @ count INT |
DECLARE @ index INT |
DECLARE @lock TINYINT |
|
SET @lock = 0 |
|
DECLARE @temp_who_lock AS TABLE ( |
id INT identity(1, 1), |
spid INT , |
blk INT |
) |
|
IF @@error <> 0 |
RETURN @@error |
|
INSERT INTO @temp_who_lock ( |
spid, |
blk |
) |
SELECT 0, |
blocked |
FROM ( |
SELECT * |
FROM master..sysprocesses |
WHERE blocked > 0 |
) a |
WHERE NOT EXISTS ( |
SELECT TOP 1 1 |
FROM master..sysprocesses |
WHERE a.blocked = spid |
AND blocked > 0 |
) |
UNION |
SELECT spid, |
blocked |
FROM master..sysprocesses |
WHERE blocked > 0 |
|
IF @@error <> 0 |
RETURN @@error |
|
SELECT @ count = count (1), |
@ index = 1 |
FROM @temp_who_lock |
|
IF @@error <> 0 |
RETURN @@error |
|
IF @ count = 0 |
BEGIN |
SELECT N '没有阻塞和死锁信息' |
|
RETURN 0 |
END |
|
WHILE @ index <= @ count |
BEGIN |
IF EXISTS ( |
SELECT TOP 1 1 |
FROM @temp_who_lock a |
WHERE id > @ index |
AND EXISTS ( |
SELECT TOP 1 1 |
FROM @temp_who_lock |
WHERE id <= @ index |
AND a.blk = spid |
) |
) |
BEGIN |
SET @lock = 1 |
|
SELECT @spid = spid, |
@blk = blk |
FROM @temp_who_lock |
WHERE id = @ index |
|
SELECT N '引起数据库死锁的是:' + CAST (@spid AS NVARCHAR(10)) + N '进程号,其执行的SQL语法如下' |
|
SELECT @spid, |
@blk |
|
DBCC INPUTBUFFER (@spid) |
|
DBCC INPUTBUFFER (@blk) |
END |
|
SET @ index = @ index + 1 |
END |
|
IF @lock = 0 |
BEGIN |
SET @ index = 1 |
|
WHILE @ index <= @ count |
BEGIN |
SELECT @spid = spid, |
@blk = blk |
FROM @temp_who_lock |
WHERE id = @ index |
|
IF @spid = 0 |
SELECT N '引起阻塞的是:' + CAST (@blk AS NVARCHAR(10)) + N '进程号,其执行的SQL语法如下' |
ELSE |
SELECT N '进程号SPID:' + CAST (@spid AS NVARCHAR(10)) + N '被进程号SPID:' + CAST (@blk AS NVARCHAR(10)) + N '阻塞,其当前进程执行的SQL语法如下' |
|
DBCC INPUTBUFFER (@spid) |
|
DBCC INPUTBUFFER (@blk) |
|
SET @ index = @ index + 1 |
END |
END |
|
RETURN 0 |
END |
GO |
|
EXEC #sp_who_lock |