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

 

作者: RDIFramework.NET
出处:http://www.cnblogs.com/huyong/
Email:406590790@qq.com
QQ:406590790
微信:13005007127(同手机号)
框架官网:http://www.rdiframework.net/
框架官网博客:http://blog.rdiframework.net/
框架其他博客:http://blog.csdn.net/chinahuyong
               http://www.cnblogs.com/huyong
RDIFramework.NET基于全新.NET Framework与.NET Core的快速信息化系统开发、整合框架,为企业快速构建垮平台、企业级的应用提供了强大支持。
关于作者:系统架构师、信息系统项目管理师、DBA。专注于微软平台项目架构、管理和企业解决方案,多年项目开发与管理经验,曾多次组织并开发多个大型项目,在面向对象、面向服务以及数据库领域有一定的造诣。现主要从事基于 RDIFramework.NET 框架的技术开发、咨询工作,主要服务于金融、医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。
如有问题或建议,请多多赐教!
本文版权归作者和CNBLOGS博客共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过微信、邮箱、QQ等联系我,非常感谢。

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