/************************************************************ * 标题: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'<Root><File>' + replace(@DataFiles, @SplitStr, N'</File><File>') + N'</File></Root>' 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数据库
免责声明:本站内容仅用于学习参考,信息和图片素材来源于互联网,如内容侵权与违规,请联系我们进行删除,我们将在三个工作日内处理。联系邮箱:chuangshanghai#qq.com(把#换成@)