找锁死的表的过程

以下过程可以查找到锁死的进程

USE [ksoa]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[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 master.dbo.sysprocesses where  blocked>0 ) a
where not EXISTS (select * from (select * from master.dbo.sysprocesses where  blocked>0) b where spid=a.blocked)
union 
select spid,blocked from master.dbo.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


你可能感兴趣的:(时空)