查询数据库中导致死锁的SQL语句

 if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[sp_who_lock]')   and   OBJECTPROPERTY(id,   N'IsProcedure')   =   1)  
  drop   procedure   [dbo].[sp_who_lock]  
  GO  
  /***************************************************************************  
  //     创建   :   fengyu     邮件   :   [email protected]     日期   :2004-04-30  
  //     修改   :   从 http://www.csdn.net/develop/Read_Article.asp?id=26566学习到并改写      
  //     说明   :   查看数据库里阻塞和死锁情况  
  ***************************************************************************/  
  use   master  
  go  
  create   procedure   sp_who_lock  
  as  
  begin  
  declare   @spid   int,@bl   int,  
  @intTransactionCountOnEntry   int,  
                  @intRowcount   int,  
                  @intCountProperties   int,  
                  @intCounter   int  
   
  create   table   #tmp_lock_who   (  
  id   int   identity(1,1),  
  spid   smallint,  
  bl   smallint)  
   
  IF   @@ERROR<>0   RETURN   @@ERROR  
   
  insert   into   #tmp_lock_who(spid,bl)   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  
   
  IF   @@ERROR<>0   RETURN   @@ERROR  
     
  --   找到临时表的记录数  
  select   @intCountProperties   =   Count(*),@intCounter   =   1  
  from   #tmp_lock_who  
   
  IF   @@ERROR<>0   RETURN   @@ERROR  
   
  if @intCountProperties=0  
  select   '现在没有阻塞和死锁信息'   as   message  
   
  --   循环开始  
  while   @intCounter   <=   @intCountProperties  
  begin  
  --   取第一条记录  
  select   @spid   =   spid,@bl   =   bl  
  from   #tmp_lock_who   where   Id   =   @intCounter    
  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   )  
  end  
   
  --   循环指针下移  
  set   @intCounter   =   @intCounter   +   1  
  end  
   
   
  drop   table   #tmp_lock_who  
   
  return   0  
  end  

你可能感兴趣的:(Sql,数据库)