以下过程可以查找到锁死的进程
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
时间: 2024-12-22 21:51:26