关闭SqlServer连接

时间:2023-03-08 16:41:16

经常使用需要还原数据库又不想关闭已经打开的画面,所以直接上

 CREATE PROCEDURE [dbo].[StopLogin]
@Dname varchar(50)
AS
DECLARE
@name varchar(50),
@s varchar(1000)
BEGIN
IF (@Dname = '')
BEGIN
DECLARE DataName CURSOR FOR
SELECT name FROM sysdatabases WHERE name not in ('master')
OPEN DataName
FETCH NEXT FROM DataName
INTO @name
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE tb CURSOR local
FOR
SELECT N'kill '+CAST(spid AS varchar)
FROM master.dbo.sysprocesses
WHERE dbid=db_id(@name)
OPEN tb
FETCH next FROM tb INTO @s
WHILE @@FETCH_STATUS=0
BEGIN
EXEC(@s)
FETCH NEXT FROM tb INTO @s
END
CLOSE tb
DEALLOCATE tb
FETCH NEXT FROM DataName
INTO @name
END
CLOSE DataName
DEALLOCATE DataName
END
ELSE
BEGIN
--声明游标 范围是select语句的内容
DECLARE tb CURSOR local
FOR
--spid进程ID
SELECT N'kill '+CAST(spid AS varchar)
FROM master.dbo.sysprocesses
--db_id(@Dname) 获取数据库的id
WHERE dbid=db_id(@Dname)
--打开游标
OPEN tb
--获取游标内容存入@s中
FETCH next FROM tb INTO @s
--如果获取游标成功
WHILE @@FETCH_STATUS=0
BEGIN
--执行@s 如:kill 56
EXEC(@s)
--获取游标内容存入@s中
FETCH NEXT FROM tb INTO @s
END
--关闭游标
CLOSE tb
--取消本地游标的引用
DEALLOCATE tb
END
END

使用方法 execute StopLogin @DbName

@DbName是数据库的名称,如果为'' 会关闭所有的连接除了master

注意:存储过程尽量在master库中,自己数据库中的话不能删除自己的连接。