您的位置:首页 > 数据库

获取SQL Server服务器的连接信息用脚本(在原邹建写的基础上作一点改进)与一段查询SQL Server服务器阻塞和死锁信息用的脚本

2009-03-25 13:03 579 查看
--获取SQL Server服务器的连接信息用脚本(在原邹建写的基础上作一点改进)
declare

@dbname sysname,

--要查询的数据库名(为空为所有),默认查询所有数据库的连接信息

@includeip bit

--是否显示IP地址(0否,1是),因为查询IP地址比较费时,所以增加此控制

select @dbname=null,@includeip=1

declare @dbid int

set @dbid=db_id(@dbname)

create table #tb

(id int identity(1,1),dbname sysname,hostname nchar(128),loginname nchar(128),

net_address nchar(12),net_ip nvarchar(15),prog_name nchar(128))

insert into #tb(hostname,dbname,net_address,loginname,prog_name)

select distinct hostname,db_name(dbid),net_address,loginame,program_name

from master..sysprocesses

where hostname<>'' and (@dbid is null or dbid=@dbid)

if @includeip=0 goto lb_show

--如果不显示IP地址,就直接显示

declare @sql varchar(500),@hostname nchar(128),@id int

create table #ip(hostname nchar(128),a varchar(200))

declare tb cursor local for select distinct hostname from #tb

open tb

fetch next from tb into @hostname

while @@fetch_status=0

begin

set @sql='ping '+@hostname+' -a -n 1 -l 1'

insert #ip(a) exec master..xp_cmdshell @sql

update #ip set hostname=@hostname where hostname is null

fetch next from tb into @hostname

end

update #tb set net_ip=left(a,patindex('%:%',a)-1)

from #tb a inner join (

select hostname,a=substring(a,patindex('Ping statistics for %:%',a)+20,20)

from #ip

where a like 'Ping statistics for %:%') b on a.hostname=b.hostname

drop table #ip

lb_show:

select id,数据库名=dbname,客户机名=hostname,用户名=loginname

,网卡物理地址=net_address,IP地址=net_ip,应用程序名称=prog_name

from #tb

drop table #tb

--查询结果:



------------------------------------------------------------------------------------------------------------

----一段查询SQL Server服务器阻塞和死锁信息用的脚本

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)

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

-- 找到临时表的记录数

select @intCountProperties = Count(*),@intCounter = 1

from #tmp_lock_who

if @intCountProperties=0

select N'现在没有阻塞和死锁信息' as message

-- 循环开始

while @intCounter <= @intCountProperties

begin

-- 取第一条记录

select @spid = spid,@bl = bl

from #tmp_lock_who where Id = @intCounter

begin

if @spid =0

select N'引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + N'进程号,其执行的SQL语法如下'

else

select N'进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ N'被' + N'进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +N'阻塞,其当前进程执行的SQL语法如下'

DBCC INPUTBUFFER (@bl )

end

-- 循环指针下移

set @intCounter = @intCounter + 1

end

drop table #tmp_lock_who

附:杀死相关会话的脚本为 kill SPID 注意SPID为常量,不能为变量,要用变量,请用动态语句
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: