MS SQLServer 批量附加数据库的方法

2025-09-07


/************************************************************   * 标题:MS SQLServer 批量附加数据库   * 说明:请根据下面的注释使用此脚本   * 时间: 2015/7/13 11:16:41   ************************************************************/    USE MASTER  GO    IF OBJECT_ID('[sp_AttchDataBase]') IS NOT NULL      drop PROCEDURE [sp_AttchDataBase]  GO    /*附加数据库(V2.0) Andy 2011-7-8 */  CREATE PROCEDURE sp_AttchDataBase(      @Path       NVARCHAR(1024),      @DataFiles  NVARCHAR(MAX) = NULL,      @SplitStr   NVARCHAR(50) = ','  )  AS      SET NOCOUNT ON            /*      V2.0 版本,在V1.0基础上,处理文件路径不规范原則,e.g. @DataFiles='E:\"my data DB"\"Hello RT"'            @Path       文件路径      @DataFiles  文件名列表      @SplitStr   文件名列表中的文件分隔符            1.必须把要附加的数据库文件(*.mdf和*.ldf)放到@Path下,      2.当@DataFiles Is Null 会附加@Path文件夹下的所有数据库文件.            e.g:      exec sp_AttchDataBase 'D:\db2'      */                  --检查文件路径是否正确      declare @Dir  NVARCHAR(1024),              @i    INT,              @x    XML            IF RIGHT(@Path, 1) <> '\'          SET @Path = @Path + '\'            IF CHARINDEX('\\', @Path) > 0      BEGIN          --RAISERROR 50001 N'文件路径中不能包含有"\\",@Path设置错误.'          RETURN(1)      END            SET @Dir = 'Dir ' + @Path      exec @i = xp_cmdshell @Dir,           no_output            IF @i <> 0      BEGIN          --RAISERROR 50001 N'无效的文件路径,@Path设置错误.'          RETURN(1)      END            SET @Path = replace(@Path, '"', '') /*处理文件路径不规范原則*/            declare @Files               TABLE(NAME NVARCHAR(512))      declare @filetmpfin          TABLE(                  NAME NVARCHAR(255) NOT NULL,                  depth INT NULL,                  IsFile BIT NULL              )            declare @SmoPrimayChildren   TABLE(                  STATUS INT,                  fileid INT,                  NAME SYSNAME,                  FILENAME NVARCHAR(512)              )            declare @smoPrimaryFileProp  TABLE(PROPERTY SQL_VARIANT NULL, valUE SQL_VARIANT NULL)            SET @DataFiles = replace(              replace(replace(@DataFiles, char(13) + char(10), ''), char(13), ''),              char(10),              ''          )            SET @x = N'' + replace(@DataFiles, @SplitStr, N'') +           N''                  insert INTO @Files      select t.v.value('.[1]', 'nvarchar(512)') AS NAME      FROM   @x.nodes('Root/File') t(v)      WHERE  t.v.value('.[1]', 'nvarchar(512)') > ''                  insert INTO @filetmpfin      exec MASTER.dbo.xp_dirtree @Path,           1,           1            declare @File      NVARCHAR(255),              @sql       NVARCHAR(4000),              @DataBase  SYSNAME                        declare cur_File   CURSOR        FOR          select NAME          FROM   @filetmpfin AS a          WHERE  IsFile = 1                 AND NAME LIKE '%.mdf'                 AND (                         EXISTS(                             select 1                             FROM   @Files                             WHERE  NAME = a.Name                         )                         OR @DataFiles IS NULL                     )                 AND NOT EXISTS(                         select 1                         FROM   MASTER.sys.master_files                         WHERE  physical_name = @Path + a.Name                     )            OPEN cur_File            BEGIN TRY          FETCH NEXT FROM cur_File INTO @File          WHILE @@Fetch_Status = 0          BEGIN              SET @sql = 'dbcc checkprimaryfile (N''' + @Path + @File + ''' , 2) With No_Infomsgs'                            insert INTO @smoPrimaryFileProp              exec (@sql)                            SET @sql = 'dbcc checkprimaryfile (N''' + @Path + @File + ''' , 3) With No_Infomsgs'                            insert INTO @SmoPrimayChildren              exec (@sql)                            select @DataBase = QUOTENAME(CONVERT(NVARCHAR(255), VALUE)),                     @sql = NULL              FROM   @smoPrimaryFileProp              WHERE  CONVERT(NVARCHAR(255), PROPERTY) = 'Database name'                            select @sql = ISNULL(                         @sql + ',' + char(13) + char(10),                         'Create DataBase ' + @DataBase + ' On' + char(13) + char(10)                     ) +                     '(FileName=N''' + @Path + RIGHT(                         RTRIM(FILENAME),                         CHARINDEX('\', REVERSE(RTRIM(FILENAME))) -1                     ) + ''')'              FROM   @SmoPrimayChildren                            exec (@sql + ' For Attach')                            PRINT N'成功附加数据库: ' + @DataBase                            delete               FROM   @SmoPrimayChildren                            delete               FROM   @smoPrimaryFileProp                            FETCH NEXT FROM cur_File INTO @File          END      END TRY      BEGIN CATCH          declare @Error NVARCHAR(2047)          SET @Error = ERROR_MESSAGE()          --RAISERROR 50001 @Error      END CATCH                  CLOSE cur_File      DEALLOCATE cur_File  GO    /************************************************************   * 调用方式   ************************************************************/  --use master  --Go     --exec sp_AttchDataBase   --        @Path = 'E:\100.其他\测试', -- nvarchar(1024)  --        @DataFiles = NULL, -- nvarchar(max)  --        @SplitStr = NULL -- nvarchar(50)

 

标签: ms sql server数据库

本文地址:https://www.lifejia.cn/news/208819.html

免责声明:本站内容仅用于学习参考,信息和图片素材来源于互联网,如内容侵权与违规,请联系我们进行删除,我们将在三个工作日内处理。联系邮箱:cloudinto#qq.com(把#换成@)