清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
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