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

 

 本文转自yonghu86 51CTO博客,原文链接:http://blog.51cto.com/yonghu/1321334,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值