分离当前正在使用的数据库

时间:2021-10-02 05:01:56

下面是断开指定数据库的所有用户连接的一个过程(在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表示该游标不存在;