先声明,这篇文章是转自一个好友(文心残)的Blog。
我最近在项目中遇到了这样的问题,这篇文章给了一个比较好的解决方案。
SQL Server进程阻塞的检查和解决办法(转自好友Blog)create procedure sp_who_lock
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
as
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
begin
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
declare @spid int,@bl int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
@intTransactionCountOnEntry int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
@intRowcount int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
@intCountProperties int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
@intCounter int
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
create table #tmp_lock_who (
SQL Server进程阻塞的检查和解决办法(转自好友Blog)id 
int identity(1,1),
SQL Server进程阻塞的检查和解决办法(转自好友Blog)spid 
smallint,
SQL Server进程阻塞的检查和解决办法(转自好友Blog)bl 
smallint)
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
IF @@ERROR<>0 RETURN @@ERROR
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
insert into #tmp_lock_who(spid,bl) select 0 ,blocked
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
from (select * from sysprocesses where blocked>0 ) a
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
where a.blocked=spid)
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
union select spid,blocked from sysprocesses where blocked>0
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
IF @@ERROR<>0 RETURN @@ERROR
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
-- 找到临时表的记录数
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
select @intCountProperties = Count(*),@intCounter = 1
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
from #tmp_lock_who
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
IF @@ERROR<>0 RETURN @@ERROR
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
if @intCountProperties=0
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
select '现在没有阻塞信息' as message
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
-- 循环开始
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
while @intCounter <= @intCountProperties
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
begin
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
-- 取第一条记录
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
select @spid = spid,@bl = bl
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
from #tmp_lock_who where Id = @intCounter
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
begin
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
if @spid =0
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
select '引起数据库阻塞的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
else
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下'
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
DBCC INPUTBUFFER (@bl )
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
end
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
-- 循环指针下移
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
set @intCounter = @intCounter + 1
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
end
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
drop table #tmp_lock_who
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
return 0
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
end
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
GO
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
--结束SQL阻塞的进程%%%%%%%%%%%%%%%%%%%%%%
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
create    procedure sp_Kill_lockProcess
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
as
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
begin
SQL Server进程阻塞的检查和解决办法(转自好友Blog)        
SET NOCOUNT ON
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
declare @spid int,@bl int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
@intTransactionCountOnEntry int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
@intRowcount int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
@intCountProperties int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
@intCounter int,
SQL Server进程阻塞的检查和解决办法(转自好友Blog)        
@sSql nvarchar (200)
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
create table #tmp_lock_who (
SQL Server进程阻塞的检查和解决办法(转自好友Blog) id 
int identity(1,1),
SQL Server进程阻塞的检查和解决办法(转自好友Blog) spid 
smallint,
SQL Server进程阻塞的检查和解决办法(转自好友Blog) bl 
smallint)
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
IF @@ERROR<>0 RETURN @@ERROR
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
insert into #tmp_lock_who(spid,bl)
SQL Server进程阻塞的检查和解决办法(转自好友Blog)        
select 0 ,blocked
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
from
SQL Server进程阻塞的检查和解决办法(转自好友Blog)        (
select * from sysprocesses where blocked>0 ) a
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
where not exists
SQL Server进程阻塞的检查和解决办法(转自好友Blog)        (
SQL Server进程阻塞的检查和解决办法(转自好友Blog)         
select * from (select * from sysprocesses where blocked>0 ) b
SQL Server进程阻塞的检查和解决办法(转自好友Blog)  
where a.blocked=spid
SQL Server进程阻塞的检查和解决办法(转自好友Blog)        )
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
union select spid,blocked from sysprocesses where blocked>0
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
IF @@ERROR<>0 RETURN @@ERROR
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
-- 找到临时表的记录数
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
 select @intCountProperties = Count(*),@intCounter = 1
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
from #tmp_lock_who
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
IF @@ERROR<>0 RETURN @@ERROR
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
while @intCounter <= @intCountProperties
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
begin
SQL Server进程阻塞的检查和解决办法(转自好友Blog)         
-- 取第一条记录
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
  select @spid = spid,@bl = bl
SQL Server进程阻塞的检查和解决办法(转自好友Blog)  
from #tmp_lock_who where Id = @intCounter
SQL Server进程阻塞的检查和解决办法(转自好友Blog)  
begin
SQL Server进程阻塞的检查和解决办法(转自好友Blog)   
if @spid =0
SQL Server进程阻塞的检查和解决办法(转自好友Blog)   
begin
SQL Server进程阻塞的检查和解决办法(转自好友Blog)                          
set @sSql='kill ' + CAST(@bl AS VARCHAR(10))
SQL Server进程阻塞的检查和解决办法(转自好友Blog)                          
exec sp_executesql @sSql
SQL Server进程阻塞的检查和解决办法(转自好友Blog)   
end
SQL Server进程阻塞的检查和解决办法(转自好友Blog)  
end
SQL Server进程阻塞的检查和解决办法(转自好友Blog)  
SQL Server进程阻塞的检查和解决办法(转自好友Blog)  
-- 循环指针下移
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
  set @intCounter = @intCounter + 1
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
end
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
drop table #tmp_lock_who
SQL Server进程阻塞的检查和解决办法(转自好友Blog)        
SET NOCOUNT OFF
SQL Server进程阻塞的检查和解决办法(转自好友Blog) 
return 0
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
end
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
SQL Server进程阻塞的检查和解决办法(转自好友Blog)
GO

相关文章: