用这个断开数据库中正在使用的所有用户试试!
use  master 
go
create  proc  killspid  (@dbname  varchar(20))  
as  
begin  
declare  @sql  nvarchar(500),@temp varchar(1000)
declare  @spid  int  
set  @sql='declare  getspid  cursor  for    
select  spid  from  sysprocesses  where  dbid=db_id('''+@dbname+''')'  
exec  (@sql)  
open  getspid  
fetch  next  from  getspid  into  @spid  
while  @@fetch_status  <  >-1  
begin  
  set @temp='kill  '+rtrim(@spid)
  exec(@temp)
fetch  next  from  getspid  into  @spid  
end  
close  getspid  
deallocate  getspid  
end  --用法  
use  master  
exec  killspid  '数据库名'

解决方案 »

  1.   

    哇噻,开眼界了,我的方法你试一试,首先重新启动SQL服务,然后紧跟着恢复数据库文件,如果还不行,我想是你的SQL-SERVER安装的路径问题了。:)GOOD LUCK!
      

  2.   

    事先说明:这段代码是邹建先生发给我的,你在使用的时候改一下连接属性'*************************************************************************
    '**函 数 名:frestoredatabase_a
    '**描    述:恢复数据库,返回出错信息,正常恢复,返回""
    '**调    用:frestoredatabase_a "备份文件名","数据库名"
    '**参数说明:
    '**          sDataBasePath  恢复后的数据库存放目录
    '**          sBackupNumber  是从那个备份号恢复
    '**          sReplaceExist  指定是否覆盖已经存在的数据
    '**说    明:引用Microsoft ActiveX Data Objects 2.x Library
    '*************************************************************************
    Public Function fRestoreDatabase_a(ByVal sBackUpfileName$ _
                                    , Optional ByVal sDataBasePath$ = "" _
                                    , Optional sDataBaseName$ = DBNAME _
                                    , Optional ByVal sBackupNumber& = 1 _
                                    , Optional ByVal sReplaceExist As Boolean = True _
                                    ) As String
        
        Dim iRe As ADODB.Recordset
        Dim iConcStr$, iSql$, iReturn$, iI&    'On Error Resume Next
        
        '创建对象    Set iRe = New ADODB.Recordset    '得到还原后的数据库存放目录,如果没有指定,存放到SQL SERVER的DATA目录
        If sDataBasePath = "" Then
            iSql = "select filename from master..sysfiles"
            iRe.Open iSql, cnn.objCnn, adOpenKeyset, adLockReadOnly
            iSql = iRe(0)
            iRe.Close
            sDataBasePath = Left(iSql, InStrRev(iSql, "\"))
        End If
        
        '检查数据库是否存在
        If sReplaceExist = False Then
            iSql = "select 1 from master..sysdatabases  where name='" & sDataBaseName & "'"
            iRe.Open iSql, cnn.objCnn, adOpenKeyset, adLockReadOnly
            If iRe.EOF = False Then
                iReturn = "数据库已经存在!"
                iRe.Close
                GoTo lbExit
            End If
            iRe.Close
        End If
        cnn.objCnn.DefaultDatabase = "master"
        '关闭用户进程,防止其它用户正在使用数据库,导致数据恢复失败
        iSql = "select spid from master..sysprocesses where dbid=db_id('" & sDataBaseName & "')"
        iRe.Open iSql, cnn.objCnn, adOpenKeyset, adLockReadOnly
        While iRe.EOF = False
            iSql = "kill " & iRe(0)
            cnn.objCnn.Execute iSql
            Debug.Assert iRe.EOF
            
            iRe.MoveNext
        Wend
        iRe.Close
        On Error GoTo lbErr
        '获取数据库恢复信息
        iSql = "restore filelistonly from disk='" & sBackUpfileName & "'" & _
            " with file=" & sBackupNumber
        'Debug.Print iSql
        Set iRe = cnn.objCnn.Execute(iSql)
        
        '生成数据库恢复语句
        iSql = "restore database [" & sDataBaseName & "]" & _
            " from disk='" & sBackUpfileName & "'" & _
            " with file=" & sBackupNumber
        Debug.Print iSql
        With iRe
            While Not .EOF
                iReturn = iRe("PhysicalName")
                iI = InStrRev(iReturn, ".")
                iReturn = IIf(iI = 0, "", Mid(iReturn, iI)) & "'"
                iSql = iSql & ",move '" & iRe("LogicalName") & _
                        "' to '" & sDataBasePath & sDataBaseName & iReturn & vbCrLf
                .MoveNext
            Wend
            .Close
        End With
        iSql = iSql & IIf(sReplaceExist, ",replace", "")
        
        cnn.objCnn.Execute iSql
        iReturn = ""
        GoTo lbExit
        
    lbErr:
        iReturn = Error
    lbExit:
        cnn.objCnn.DefaultDatabase = DBNAME
        fRestoreDatabase_a = iReturn
    End Function
      

  3.   

    谢谢 DigJim(挖土) !
    出现提示while  @@fetch_status  <  >-1 中有语法错误!
    也谢谢其它各位,我正在使用这种方法测试!
      

  4.   

    --在master数据库中创建这个存储过程/*--恢复数据库--邹建 2003.10--*//*--调用示例
    --完整恢复数据库
    exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db'--差异备份恢复
    exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'
    exec p_backupdb @bkfile='c:\db_20031015_df.bak',@dbname='db',@retype='DF'--日志备份恢复
    exec p_RestoreDb @bkfile='c:\db_20031015_db.bak',@dbname='db',@retype='DBNOR'
    exec p_backupdb @bkfile='c:\db_20031015_log.bak',@dbname='db',@retype='LOG'--*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_RestoreDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_RestoreDb]
    GOcreate proc p_RestoreDb
    @bkfile nvarchar(1000), --定义要恢复的备份文件名
    @dbname sysname='',     --定义恢复后的数据库名,默认为备份的文件名
    @dbpath nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录
    @retype nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异备份的恢复,'LOG' 日志恢复
    @filenumber int=1, --恢复的文件号
    @overexist bit=1,        --是否覆盖已经存在的数据库,仅@retype为'DB'/'DBNOR'是有效
    @killuser bit=1     --是否关闭用户使用进程,仅@overexist=1时有效
    as
    declare @sql varchar(8000)--得到恢复后的数据库名
    if isnull(@dbname,'')=''
    select @sql=reverse(@bkfile)
    ,@sql=case when charindex('.',@sql)=0 then @sql
    else substring(@sql,charindex('.',@sql)+1,1000) end
    ,@sql=case when charindex('\',@sql)=0 then @sql
    else left(@sql,charindex('\',@sql)-1) end
    ,@dbname=reverse(@sql)--得到恢复后的数据库存放目录
    if isnull(@dbpath,'')=''
    begin
    select @dbpath=rtrim(reverse(filename)) from master..sysfiles where name='master'
    select @dbpath=reverse(substring(@dbpath,charindex('\',@dbpath),4000))
    end--生成数据库恢复语句
    set @sql='restore '+case @retype when 'LOG' then 'log ' else 'database ' end+@dbname
    +' from disk='''+@bkfile+''''
    +' with file='+cast(@filenumber as varchar)
    +case when @overexist=1 and @retype in('DB','DBNOR') then ',replace' else '' end
    +case @retype when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end--添加移动逻辑文件的处理
    if @retype='DB' or @retype='DBNOR'
    begin
    --从备份文件中获取逻辑文件名
    declare @lfn nvarchar(128),@tp char(1),@i int --创建临时表,保存获取的信息
    create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
    --从备份文件中获取信息
    insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''')
    declare #f cursor for select ln,tp from #tb
    open #f
    fetch next from #f into @lfn,@tp
    set @i=0
    while @@fetch_status=0
    begin
    select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@i as varchar)
    +case @tp when 'D' then '.mdf''' else '.ldf''' end
    ,@i=@i+1
    fetch next from #f into @lfn,@tp
    end
    close #f
    deallocate #f
    end--关闭用户进程处理
    if @overexist=1 and @killuser=1
    begin
    declare @spid varchar(20)
    declare #spid cursor for
    select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)
    open #spid
    fetch next from #spid into @spid
    while @@fetch_status=0
    begin  
    exec('kill '+@spid)
    fetch next from #spid into @spid
    end  
    close #spid
    deallocate #spid
    end--恢复数据库
    exec(@sql)go
      

  5.   

    出现提示while  @@fetch_status  &lt;  &gt;-1 中有语法错误!while  @@fetch_status  <> 1
      

  6.   

    有的时候“<>”,这个会在网上转换成“&lt;  &gt;”
      

  7.   

    应该这样while  @@fetch_status  <> -1
      

  8.   

    还是不行,我的数据库不是在缺省的实例中,是在另一个实例里,所以DigJim(挖土) 提供的代码还不能运行。修改后,在数据库连接情况下,执行"exec  killspid database"
    会出现提示“不能断开本处的连接”;在服务器连接情况下,执行"exec  killspid database"
    会出现找不到killspid,请问怎么处理?
    谢谢!
      

  9.   

    说说两句呀。其实这个问题说简单也非常的简单,说困难也非常的困难。我前天恢复数据库的时候就遇到了这个问题,我查了一下在线用户,还有ODBC的用户,然后把他们一一杀掉,恢复就成功了呀。试试,也许会成功的呀
      

  10.   

    问题已经解决把DigJim(挖土)的方法和 zjcxc(邹建) 的方法结合起来就可以了,存储过程需要创建在master中,不能创建在自己的实例里。
    结贴
    请二位到http://expert.csdn.net/Expert/topic/2585/2585701.xml?temp=.9074976
    领分