createprocedure sp_who_lock as begin declare@spidint,@blint, @intTransactionCountOnEntryint, @intRowcountint, @intCountPropertiesint, @intCounterint createtable #tmp_lock_who ( id intidentity(1,1), spid smallint, bl smallint) IF@@ERROR<>0RETURN@@ERROR insertinto #tmp_lock_who(spid,bl) select0 ,blocked from (select*from sysprocesses where blocked>0 ) a wherenotexists(select*from (select*from sysprocesses where blocked>0 ) b where a.blocked=spid) unionselect spid,blocked from sysprocesses where blocked>0 IF@@ERROR<>0RETURN@@ERROR -- 找到临时表的记录数 select@intCountProperties=Count(*),@intCounter=1 from #tmp_lock_who IF@@ERROR<>0RETURN@@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(@blASVARCHAR(10)) +'进程号,其执行的SQL语法如下' else select'进程号SPID:'+CAST(@spidASVARCHAR(10))+'被'+'进程号SPID:'+CAST(@blASVARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下' DBCC INPUTBUFFER (@bl ) end -- 循环指针下移 set@intCounter=@intCounter+1 end droptable #tmp_lock_who return0 end GO
--结束SQL阻塞的进程%%%%%%%%%%%%%%%%%%%%%% createprocedure sp_Kill_lockProcess as begin SET NOCOUNT ON declare@spidint,@blint, @intTransactionCountOnEntryint, @intRowcountint, @intCountPropertiesint, @intCounterint, @sSqlnvarchar (200) createtable #tmp_lock_who ( id intidentity(1,1), spid smallint, bl smallint) IF@@ERROR<>0RETURN@@ERROR insertinto #tmp_lock_who(spid,bl) select0 ,blocked from (select*from sysprocesses where blocked>0 ) a wherenotexists ( select*from (select*from sysprocesses where blocked>0 ) b where a.blocked=spid ) unionselect spid,blocked from sysprocesses where blocked>0 IF@@ERROR<>0RETURN@@ERROR -- 找到临时表的记录数 select@intCountProperties=Count(*),@intCounter=1 from #tmp_lock_who IF@@ERROR<>0RETURN@@ERROR while@intCounter<=@intCountProperties begin -- 取第一条记录 select@spid= spid,@bl= bl from #tmp_lock_who where Id =@intCounter begin if@spid=0 begin set@sSql='kill '+CAST(@blASVARCHAR(10)) exec sp_executesql @sSql end end -- 循环指针下移 set@intCounter=@intCounter+1 end droptable #tmp_lock_who SET NOCOUNT OFF return0 end GO