数据库批量分离、附加

一、数据库批量分离

原文章地址

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


二、批量附加(比较麻烦)  

原文章地址

--使用方法:在重装系统前,运行这个,把生成的SQL语句保存起来
--     重装系统后再运行生成的那个文件,便可实现批量附加数据库
--目前只适合SQL2005,SQL2000的不行,还正在研究。


USE [master]
GO
IF OBJECT_ID('attach_db_pro') IS NOT NULL
DROP PROCEDURE attach_db_pro
GO


CREATE PROCEDURE attach_db_pro
@dir NVARCHAR(520)
AS
DECLARE @dbname VARCHAR(20)
DECLARE @filename NVARCHAR(520)
DECLARE @name SYSNAME
DECLARE @temp_db_name VARCHAR(20)
DECLARE @i INT
DECLARE my_cursor CURSOR
FOR 
    SELECT  DB_NAME(DBID) dbname,name,filename FROM master..sysaltfiles
    OPEN my_cursor
    FETCH NEXT FROM my_cursor INTO @dbname,@name,@filename
    WHILE  @@fetch_status = 0
    BEGIN
          SET @temp_db_name = @dbname
          SET @i = 1
          PRINT 'exec sp_attach_db @db_name = ' + @dbname + ',@filename' + CONVERT(VARCHAR,@i) + ' = ''' + @dir + '\' + @name + RIGHT(@filename,4)+''''
          FETCH NEXT FROM my_cursor INTO @dbname,@name,@filename
          WHILE @@fetch_status = 0 AND @temp_db_name = @dbname
          BEGIN
                  SET @i = @i + 1
                  print ',@filename' + CONVERT(VARCHAR,@i) + ' = ''' + @dir + '\'+@name+RIGHT(@filename,4)+''''
                  FETCH NEXT FROM my_cursor INTO @dbname,@name,@filename
          END
          PRINT ''
    END
CLOSE my_cursor
DEALLOCATE my_cursor
GO


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值