【网学网提醒】:网学会员为您提供自动检查sqlserver中死锁的存储过程参考,解决您在自动检查sqlserver中死锁的存储过程学习中工作中的难题,参考学习。
CREATEPROCEDUREauto_checkblocksAS
setnocounton
ifexists(select*frommaster..sysprocesseswhereblocked<>0)
begin
/*showtopblockers,butnoduplicates*/
selectconvert(char(24),getdate(),13)
select'注意发生阻塞!请不要慌张,请仔细查看下面的信息。导致问题的锁进程:'
select'请尝试使用KILL[SPID]来杀进程'
select'请尝试使用SP_LOCK[SPID]来显示锁信息,用OBJECT_NAME(ID)来显示锁对象名称或用sp_who[SPID]来显示信息'
select'在使用OBJECT_NAME显示对象名称时请注意对应的db_id'
selectdistinct
'进程ID'=str(spid,4),
'进程ID状态'=convert(char(10),status),
'分块进程的进程ID'=str(blocked,2),
'工作站名称'=convert(char(10),hostname),
'执行命令的用户'=convert(char(10),suser_name(uid)),
'数据库名'=convert(char(10),db_name(dbid)),
'应用程序名'=convert(char(10),program_name),
'正在执行的命令'=convert(char(16),cmd),
'累计CPU时间'=str(cpu,7),
'IO'=str(physical_io,7),
'登录名'=loginame
frommaster..sysprocesses
wherespidin(selectblockedfrommaster..sysprocesses)
andblocked=0
orderbystr(spid,4)
/*显示阻塞牺牲品*/
select'以上阻塞的牺牲品'
select
'进程ID[SPID]'=str(spid,4),
'进程ID状态'=convert(char(10),status),
'分块进程的进程ID'=str(blocked,2),
'工作站名称'=convert(char(10),hostname),
'执行命令的用户'=convert(char(10),suser_name(uid)),
'数据库名'=convert(char(10),db_name(dbid)),
'应用程序名'=convert(char(10),program_name),
'正在执行的命令'=convert(char(16),cmd),
'累计CPU时间'=str(cpu,7),
'IO'=str(physical_io,7),
'登录名'=loginame
frommaster..sysprocesses
whereblocked<>0
orderbyspid
end
else
begin
select'恭喜!当前没有阻塞,当前的进程信息
如下.',convert(char(24),getdate(),13)
select
'进程ID'=str(spid,4),
'进程ID状态'=convert(char(10),status),
'分块进程的进程ID'=str(blocked,2),
'工作站名称'=convert(char(10),hostname),
'执行命令的用户'=convert(char(10),suser_name(uid)),
'数据库名'=convert(char(10),db_name(dbid)),
'应用程序名'=convert(char(10),program_name),
'正在执行的命令'=convert(char(16),cmd),
'累计CPU时间'=str(cpu,7),
'IO'=str(physical_io,7),
'登录名'=loginame
frommaster..sysprocesses
whereblocked=0
orderbyspid
end
return
GO