[推荐] (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 @   .NET快速开发框架  阅读(3122)  评论(6编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示