USE MASTER GO IF OBJECT_ID('[sp_AttchDataBase]') IS NOT NULL drop PROCEDURE [sp_AttchDataBase] GO CREATE PROCEDURE sp_AttchDataBase( @Path NVARCHAR(1024), @DataFiles NVARCHAR(MAX) = NULL, @SplitStr NVARCHAR(50) = ',' ) AS SET NOCOUNT ON --检查文件路径是否正确 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)