SQLSERVER查询数据库死锁的存储过程

原文:SQLSERVER查询数据库死锁的存储过程

USE [IdentityDemo]
GO
/****** Object:  StoredProcedure [dbo].[sp_who_lock]    Script Date: 2019/1/17 10:47:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[sp_who_lock]
as
begin
   declare @spid int
   declare @blk int
   declare @count int
   declare @index int
   declare @lock tinyint
   set @lock=0
   create table #temp_who_lock
 (
  id int identity(1,1),
  spid int,
  blk int
 )
 if @@error<>0 return @@error
 insert into #temp_who_lock(spid,blk)
 select 0 ,blocked
 from (select * from master..sysprocesses where blocked>0)a
 where not exists(select * from  master..sysprocesses where a.blocked =spid and blocked>0)
 union select spid,blocked from  master..sysprocesses where blocked>0
 if @@error<>0 return @@error
 select @count=count(*),@index=1 from #temp_who_lock
 if @@error<>0 return @@error
 if @count=0
 begin
  select ‘没有阻塞和死锁信息‘
  return 0
 end
 while @index<=@count
 begin
  if exists(select 1 from #temp_who_lock a where id>@index and exists(select 1 from #temp_who_lock where id<=@index and a.blk=spid))
  begin
   set @lock=1
   select @spid=spid,@blk=blk from #temp_who_lock where id=@index
   select ‘引起数据库死锁的是: ‘+ CAST(@spid AS VARCHAR(10)) + ‘进程号,其执行的SQL语法如下‘
   select  @spid, @blk
   dbcc inputbuffer(@spid)
   dbcc inputbuffer(@blk)
  end
  set @index=@index+1
 end
 if @lock=0
 begin
  set @index=1
  while @index<=@count
  begin
   select @spid=spid,@blk=blk from #temp_who_lock where id=@index
   if @spid=0
    select ‘引起阻塞的是:‘+cast(@blk as varchar(10))+ ‘进程号,其执行的SQL语法如下‘
   else
    select ‘进程号SPID:‘+ CAST(@spid AS VARCHAR(10))+ ‘被‘ + ‘进程号SPID:‘+ CAST(@blk AS VARCHAR(10)) +‘阻塞,其当前进程执行的SQL语法如下‘
   dbcc inputbuffer(@spid)
   dbcc inputbuffer(@blk)
   set @index=@index+1
  end
 end
 drop table #temp_who_lock
 return 0
end

使用方法:

exec sp_who_lock  //执行死锁查询

kill 54  //杀死阻塞的进程

原文地址:https://www.cnblogs.com/lonelyxmas/p/10309324.html

时间: 2024-08-08 19:34:51

SQLSERVER查询数据库死锁的存储过程的相关文章

sqlserver查询数据库中有多少个表

sqlserver查询数据库中有多少个表 <div class="articalTitle" style="clear:both; line-height:20px; padding-bottom:10px;> SELECT * FROM sysobjects WHERE (xtype = 'U') C = CHECK 约束 D = 默认值或 DEFAULT 约束 F = FOREIGN KEY 约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P =

Sqlserver查询数据库文件大小和剩余空间

在MS Sql Server中可以能过以下的方法查询出磁盘空间的使用情况及各数据库数据文件及日志文件的大小及使用利用率: 1.查询各个磁盘分区的剩余空间:Exec master.dbo.xp_fixeddrives 2.查询数据库的数据文件及日志文件的相关信息(包括文件组.当前文件大小.文件最大值.文件增长设置.文件逻辑名.文件路径等)select * from [数据库名].[dbo].[sysfiles]转换文件大小单位为MB:select name, convert(float,size)

SQLserver查询数据库所有字段-表名

SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='Account' SELECT (case when a.colorder=1 then d.name else '' end) as 表名,--如果表名相同就返回空 a.colorder as 字段序号, a.name as 字段名, (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' e

sqlserver查询数据库中有多少个表,多少视图,多少存储过程,或其他对象

sql server 数表: select count(1) from sysobjects where xtype='U' 数视图: select count(1) from sysobjects where xtype='V' 数存储过程 select count(1) from sysobjects where xtype='P' SELECT * FROM sysobjects WHERE (xtype = 'U') C = CHECK 约束 D = 默认值或 DEFAULT 约束 F

(转)SQLServer查询数据库各种历史记录

原文地址https://www.cnblogs.com/seusoftware/p/4826958.html 在SQL Server数据库中,从登陆开始,然后做了什么操作,以及数据库里发生了什么,大多都是有记录可循的,但是也有一些确实无从查起. 一. 数据库启动记录 1. 最近一次启动SQL Server的时间 select sqlserver_start_time from sys.dm_os_sys_info; --也可参考系统进程创建的时间,比服务启动时间略晚(秒级) select log

(转)SQLServer查询数据库各种历史记录

一. 数据库启动记录 1. 最近一次启动SQL Server的时间 select sqlserver_start_time from sys.dm_os_sys_info; --也可参考系统进程创建的时间,比服务启动时间略晚(秒级) select login_time from sysprocesses where spid = 1 select login_time from sys.dm_exec_sessions where session_id = 1 --也可参考tempdb数据库创建

SQLSERVER 查询数据库信息

use dbname SELECT * FROM sysobjects WHERE (xtype = 'U') go xtype可替换为如下参数 --C = CHECK 约束 --D = 默认值或 DEFAULT 约束 --F = FOREIGN KEY 约束 --L = 日志 --FN = 标量函数 --IF = 内嵌表函数 --P = 存储过程 --PK = PRIMARY KEY 约束(类型是 K) --RF = 复制筛选存储过程 --S = 系统表 --TF = 表函数 --TR = 触

【转】sqlserver查询数据库中有多少个表

sql server 数表: select count(1) from sysobjects where xtype='U' 数视图: select count(1) from sysobjects where xtype='V' 数存储过程 select count(1) from sysobjects where xtype='P' SELECT * FROM sysobjects WHERE (xtype = 'U') C = CHECK 约束 D = 默认值或 DEFAULT 约束 F

SQL2008查询数据库死锁并解锁

一.执行EXEC SP_LOCK,查出ObjId 二.执行select OBJECT_NAME(ObjId) ,查出表名是否是死锁的表 三.执行 declare @SPID int Set @SPID = spid   declare @sql varchar(1000)set @sql='kill '+cast(@SPID as varchar)exec(@sql) 搞定