[推荐] (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(11),
     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

 

posted @ 2012-01-16 14:28  .NET快速开发框架  阅读(3113)  评论(6编辑  收藏  举报