分离当前正在使用的数据库
下面是断开指定数据库的所有用户连接的一个过程(在master数据库中进行)
//创建要分离的数据库的连接的存储过程
use master
go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_KillSpid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) //判断master数据库中是否已经存在该存储过程
drop procedure [dbo].[sp_KillSpid] //若存在则删除该存储过程
GO
create proc sp_KillSpid //创建存储过程
@dbname sysname --要断开连接的数据库名
as
declare @s nvarchar(1000)
declare tb cursor local for //定义游标
select N'kill '+cast(spid as varchar)
from master..sysprocesses
where dbid=db_id(@dbname)
open tb //打开游标
fetch next from tb into @s //填充数据
while @@fetch_status=0 //判断游标的状态
begin
exec(@s) //执行动态的sql语句
fetch next from tb into @s //填充下一条记录
end
close tb //关闭游标
deallocate tb //释放游标
go
--调用删除要分离的数据库的连接的存储过程
exec sp_KillSpid 'aa'
----调用分离数据库的存储过程
exec sp_detach_db '要分离的数据库的名称'
注解: a.定义游标的语法: declare 游标名称 cursor for 查询的sql语句
b. 游标的状态:
有五种状态分别对应的值和含义:
1:状态为1,表示游标的结果至少有一条记录;
2:状态为0表示游标的结果集为空;
3:状态为-1表示游标已关闭;
4:状态为-2表示未将该游标分配给以标明的变量;
5:状态为-3表示该游标不存在;