0
点赞
收藏
分享

微信扫一扫

[推荐] (SqlServer)分离所有用户数据库


[推荐] (SqlServer)分离所有用户数据库

——通过知识共享树立个人品牌。

在实际应用中,有时我们需要一次性分离所有用户数据库,下面给出代码,供大家参考。


USE  
  [ 
  master 
  ] 
  
GO 
  
IF  
  EXISTS (  
  SELECT  
  * 
  
   
  FROM sys.objects 
  
   
  WHERE  
  [ 
  object_id 
  ]  
  =  
  OBJECT_ID(N 
  ' 
  [dbo].[spDetachAllUserDatabases] 
  ') 
  
   
  AND type  
  IN ( N 
  ' 
  P 
  ', N 
  ' 
  PC 
  ' ) )  
  
   
  DROP  
  PROCEDURE  
  [ 
  dbo 
  ]. 
  [ 
  spDetachAllUserDatabases 
  ] 
  
GO 
  

CREATE  
  PROCEDURE  
  [ 
  dbo 
  ]. 
  [ 
  spDetachAllUserDatabases 
  ] 
  
AS  
  
   
  BEGIN 
  
       
  -- 
  Declare Variables 
  
      
  DECLARE  
  @DatabaseName  
  VARCHAR( 
  100) 
  
       
  DECLARE  
  @MinDatabaseID  
  INT 
  
       
  DECLARE  
  @MaxDatabaseID  
  INT 
  
       
  DECLARE  
  @SQL  
  VARCHAR( 
  4000) 
  
       
  -- 
  Check for temporary table and drop it if it exists 
  
      
  IF  
  OBJECT_ID( 
  ' 
  tempDB.dbo.#Database 
  ')  
  IS  
  NOT  
  NULL  
  
       
  DROP  
  TABLE  
  [ 
  #Database 
  ]; 
  

       
  -- 
  Create temporary table 
  
      
  CREATE  
  TABLE # 
  Database 
  
      ( 
  
      ID  
  INT  
  IDENTITY( 
  1,  
  1), 
  
      DatabaseName  
  VARCHAR( 
  100) 
  
      ) 
  
       
  
       
  -- 
  Check for existing user databases 
  
      
  IF  
  EXISTS (  
  SELECT name 
  
       
  FROM sys.databases 
  
       
  WHERE database_id  
  >  
  4 
  
       
  AND name  
  NOT  
  IN (  
  ' 
  SQLDBA 
  ',  
  ' 
  ReportServer 
  ', 
  
       
  ' 
  ReportServerTempDB 
  ', 
  
       
  ' 
  distribution 
  ' ) )  
  
       
  BEGIN  
  
           
  -- 
  Insert all database names into a temporary table 
  
          
  INSERT  
  INTO # 
  Database ( DatabaseName ) 
  
           
  SELECT name 
  
           
  FROM sys.databases 
  
           
  WHERE database_id  
  >  
  4 
  
           
  AND name  
  NOT  
  IN (  
  ' 
  SQLDBA 
  ',  
  ' 
  ReportServer 
  ', 
  
           
  ' 
  ReportServerTempDB 
  ', 
  
           
  ' 
  distribution 
  ' )  
  
           
  
           
  -- 
  Set Variables for the detach database loop  
  
          
  SELECT  
  @MinDatabaseID  
  =  
  MIN(ID), 
  
           
  @MaxDatabaseID  
  =  
  MAX(ID) 
  
           
  FROM # 
  Database 
  
          
  
           
  -- 
  Begin loop to detach databases 
  
          
  WHILE  
  @MinDatabaseID  
  <=  
  @MaxDatabaseID 
  
           
  BEGIN 
  
           
  
           
  -- 
  Get DatabaseName 
  
          
  SELECT  
  @DatabaseName  
  = DatabaseName 
  
           
  FROM # 
  Database 
  
           
  WHERE ID  
  =  
  @MinDatabaseID 
  
           
  
           
  -- 
  Build Detach Database Command 
  
          
  SET  
  @SQL  
  =  
  ' 
  EXEC sp_detach_db  
  '  
  +  
  ''''  
  +  
  @DatabaseName 
  
           
  +  
  ''''  
  +  
  ' 
  ; 
  ' 
  

           
  -- 
  Try Catch block to execute SQL and handle errors   
  
          
  BEGIN TRY 
  

           
  -- 
  Detach Database 
  
          
  EXEC (  
  @SQL 
  
          ) 
  
           
  PRINT  
  ' 
  Detached  
  '  
  +  
  @DatabaseName 
  
           
  END TRY 
  
           
  BEGIN CATCH 
  
           
  SELECT  
  @DatabaseName, 
  
          message_id, 
  
          severity, 
  
           
  [ 
  text 
  ], 
  
           
  @SQL 
  
           
  FROM sys.messages 
  
           
  WHERE message_id  
  =  
  @@ERROR 
  
           
  AND language_id  
  =  
  1033  
  -- 
  British English 
  
          
  END CATCH 
  

           
  -- 
  Get the next DatabaseName ID 
  
          
  SET  
  @MinDatabaseID  
  =  
  @MinDatabaseID  
  +  
  1 
  
           
  
           
  -- 
  End Loop 
  
          
  END 
  
       
  END 
  
   
  END 
  

GO

 


举报

相关推荐

0 条评论