天天看點

擷取連接配接SQL伺服器的資訊

create   proc   p_getlinkinfo  

  @dbname   sysname=null,--要查詢的資料庫名,預設查詢所有資料庫的連接配接資訊  

  @includeip   bit=0--是否顯示IP位址,因為查詢IP位址比較費時,是以增加此控制  

  as  

  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   [email protected])  

  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   '[email protected]+'   -a   -n   1   -l   1'  

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

  update   #ip   set   [email protected]   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  

  lb_show:  

  select   id,資料庫名=dbname,客戶機名=hostname,使用者名=loginname  

  ,網卡實體位址=net_address,IP位址=net_ip,應用程式名稱=prog_name   from   #tb  

  go