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

时间:2021-07-25 07:12:57

查询连接数

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, N'IsProcedure') = 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