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

 使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里.

创建sp_who_lock存储过程

CREATE  procedure  sp_who_lock  
as     
begin     
    declare  @spid int     
@blk int     
@ count  int     
@ index  int     
@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  ( * master..sysprocesses where  blocked>0)a     
where  not  exists( from   a.blocked =spid and  blocked>0)     
union  spid,blocked blocked>0     
@@error     
count = (*),@ index =1 #temp_who_lock     
@@error     
if @ =0     
begin     
   select  '没有阻塞和死锁信息'     
0     
end     
while @ <=@ count      
begin     
if exists( 1 #temp_who_lock a id>@ index  #temp_who_lock id<=@ a.blk=spid))     
begin     
@lock=1     
@spid=spid,@blk=blk id=@ index     
'引起数据库死锁的是: ' + CAST (@spid AS  VARCHAR (10)) + '进程号,其执行的sql语法如下'     
select   @spid,@blk   
    dbcc inputbuffer(@spid)     
dbcc inputbuffer(@blk)     
end     
=@ +1     
end     
if @lock=0      
begin     
=1     
count      
begin     
index     
if @spid=0     
     '引起阻塞的是:' + cast (@blk as  varchar (10))+ sql string" style="white-space:pre-wrap; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.8em!important; margin:0px!important; outline:rgb(0,其执行的sql语法如下'     
else      
'进程号SPID:' '被'  + (10)) + '阻塞,其当前进程执行的sql语法如下'     
dbcc inputbuffer(@spid)   
dbcc inputbuffer(@blk)     
+1     
end     
end     
drop  #temp_who_lock     
0     
end           
 
 
GO

查询分析器中执行:

exec sp_who_lock

 

直到最后的结果为:

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...