下面是我整理的监控sql server数据库,在性能测试过程中是否出现死锁、堵塞的SQL语句,还算比较准备,留下来备用。
调用方法:选中相应的数据库,执行exec sp_who_lock- USE [master]
- 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 sysprocesses where blocked>0 ) a
- where not exists(select * from (select * from sysprocesses where blocked>0 ) b
- where a.blocked=spid)
- union select spid,blocked from 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
复制代码
来源:https://www.jb51.net/article/81527.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|