首页 > 代码库 > 关于SqlServer2008小记(查询数据库连接数,强行干掉连接)

关于SqlServer2008小记(查询数据库连接数,强行干掉连接)

查询连接数

select count(*) from master.dbo.sysprocesses

这条语句查出来的是所有连接到本机(或者连接到本服务器)的连接数,并非是某一个库的连接数。

查询连接的库名和对应连接的user

select db_name(dbid) dbName,user_name(uid) [user] from sys.sysprocesses

查询连接到指定库的数量、user

select COUNT(*) from sys.sysprocesses where db_name(dbid) = @dbId
-- 查询连接到指定库的数量  @dbId [指定的库名]

select distinct user_name(uid) [user] from sys.sysprocesses where db_name(dbid) = @dbId
-- 查询连接到指定库的user  @dbId [指定的库名]

强行干掉连接

-- 存储过程
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N[dbo].[p_killspid]) and OBJECTPROPERTY(id, NIsProcedure) = 1)  
    DROP PROCEDURE [dbo].[p_killspid]  
go  
create   proc   p_killspid   
@dbname   varchar(200) --要关闭进程的数据库名   
as       
declare   @programName     nvarchar(200),   
@spid   nvarchar(20)   
  
declare   cDblogin   cursor   for   
select   cast(spid   as   varchar(20))  AS spid   from   master..sysprocesses   where   dbid=db_id(@dbname)   
open   cDblogin  
fetch   next   from   cDblogin   into   @spid   
while   @@fetch_status=0   
begin      
--防止自己终止自己的进程    
--否则会报错不能用KILL 来终止您自己的进程。     
IF  @spid <> @@SPID  
    exec( kill   +@spid)   
fetch   next   from  cDblogin   into   @spid   
end       
close   cDblogin   
deallocate   cDblogin  
go   

-- 执行
exec   p_killspid     your database  

或者

DECLARE @temp NVARCHAR(20)
DECLARE myCurse CURSOR
FOR
  SELECT  spid
  FROM    sys.sysprocesses
  WHERE   dbid = DB_ID(your database)
OPEN myCurse
FETCH NEXT FROM myCurse INTO @temp
WHILE @@FETCH_STATUS = 0 
  BEGIN
    EXEC (kill +@temp)
    FETCH NEXT FROM myCurse INTO @temp
  END
CLOSE myCurse
DEALLOCATE myCurse

 

关于SqlServer2008小记(查询数据库连接数,强行干掉连接)