查询Sqlserver数据库死锁的一个存储过程

原文: 点击打开链接

/************************************************************
 * Code formatted by SoftTree SQL Assistant ?v6.1.35
 * Time: 2013/11/12 16:48:00
 ************************************************************/

IF OBJECT_ID('proc_who_lock') IS NOT NULL
BEGIN
    DROP PROC proc_who_lock
END
GO
CREATE PROCEDURE proc_who_lock
AS
BEGIN
	DECLARE @spid INT     
	DECLARE @blk INT     
	DECLARE @count INT     
	DECLARE @index INT     
	DECLARE @lock TINYINT      
	SET @lock = 0      
	CREATE TABLE #temp_who_lock
	(
		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 *
	           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(*),
	       @index = 1
	FROM   #temp_who_lock
	
	IF @@error <> 0
	    RETURN @@error
	
	IF @count = 0
	BEGIN
	    SELECT '没有阻塞和死锁信息' 
	    RETURN 0
	END
	
	WHILE @index <= @count
	BEGIN
	    IF EXISTS(
	           SELECT 1
	           FROM   #temp_who_lock a
	           WHERE  id > @index
	                  AND EXISTS(
	                          SELECT 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 '引起数据库死锁的是: ' + CAST(@spid AS VARCHAR(10)) + 
	               '进程号,其执行的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 '引起阻塞的是:' + CAST(@blk AS VARCHAR(10)) + 
	                   '进程号,其执行的SQL语法如下'
	        ELSE
	            SELECT '进程号SPID:' + CAST(@spid AS VARCHAR(10)) + '被' + 
	                   '进程号SPID:' + CAST(@blk AS VARCHAR(10)) + 
	                   '阻塞,其当前进程执行的SQL语法如下'
	        
	        DBCC INPUTBUFFER(@spid) 
	        DBCC INPUTBUFFER(@blk)      
	        SET @index = @index + 1
	    END
	END
	
	DROP TABLE #temp_who_lock 
	RETURN 0
END
GO
 
EXEC proc_who_lock


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值