MS SQLServer如何批量附加数据库
这篇文章主要介绍了MS SQLServer如何批量附加数据库,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
/*************************************************************标题:MSSQLServer批量附加数据库*说明:请根据下面的注释使用此脚本*时间:2015/7/1311:16:41************************************************************/USEMASTERGOIFOBJECT_ID('[sp_AttchDataBase]')ISNOTNULLDROPPROCEDURE[sp_AttchDataBase]GO/*附加数据库(V2.0)Andy2011-7-8*/CREATEPROCEDUREsp_AttchDataBase(@PathNVARCHAR(1024),@DataFilesNVARCHAR(MAX)=NULL,@SplitStrNVARCHAR(50)=',')ASSETNOCOUNTON/*V2.0版本,在V1.0基础上,处理文件路径不规范原則,e.g.@DataFiles='E:\"mydataDB"\"HelloRT"'@Path文件路径@DataFiles文件名列表@SplitStr文件名列表中的文件分隔符1.必须把要附加的数据库文件(*.mdf和*.ldf)放到@Path下,2.当@DataFilesIsNull会附加@Path文件夹下的所有数据库文件.e.g:Execsp_AttchDataBase'D:\db2'*/--检查文件路径是否正确DECLARE@DirNVARCHAR(1024),@iINT,@xXMLIFRIGHT(@Path,1)<>'\'SET@Path=@Path+'\'IFCHARINDEX('\\',@Path)>0BEGIN--RAISERROR50001N'文件路径中不能包含有"\\",@Path设置错误.'RETURN(1)ENDSET@Dir='Dir'+@PathEXEC@i=xp_cmdshell@Dir,no_outputIF@i<>0BEGIN--RAISERROR50001N'无效的文件路径,@Path设置错误.'RETURN(1)ENDSET@Path=REPLACE(@Path,'"','')/*处理文件路径不规范原則*/DECLARE@FilesTABLE(NAMENVARCHAR(512))DECLARE@filetmpfinTABLE(NAMENVARCHAR(255)NOTNULL,depthINTNULL,IsFileBITNULL)DECLARE@SmoPrimayChildrenTABLE(STATUSINT,fileidINT,NAMESYSNAME,FILENAMENVARCHAR(512))DECLARE@smoPrimaryFilePropTABLE(PROPERTYSQL_VARIANTNULL,VALUESQL_VARIANTNULL)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>'INSERTINTO@FilesSELECTt.v.value('.[1]','nvarchar(512)')ASNAMEFROM@x.nodes('Root/File')t(v)WHEREt.v.value('.[1]','nvarchar(512)')>''INSERTINTO@filetmpfinEXECMASTER.dbo.xp_dirtree@Path,1,1DECLARE@FileNVARCHAR(255),@sqlNVARCHAR(4000),@DataBaseSYSNAMEDECLAREcur_FileCURSORFORSELECTNAMEFROM@filetmpfinASaWHEREIsFile=1ANDNAMELIKE'%.mdf'AND(EXISTS(SELECT1FROM@FilesWHERENAME=a.Name)OR@DataFilesISNULL)ANDNOTEXISTS(SELECT1FROMMASTER.sys.master_filesWHEREphysical_name=@Path+a.Name)OPENcur_FileBEGINTRYFETCHNEXTFROMcur_FileINTO@FileWHILE@@Fetch_Status=0BEGINSET@sql='dbcccheckprimaryfile(N'''+@Path+@File+''',2)WithNo_Infomsgs'INSERTINTO@smoPrimaryFilePropEXEC(@sql)SET@sql='dbcccheckprimaryfile(N'''+@Path+@File+''',3)WithNo_Infomsgs'INSERTINTO@SmoPrimayChildrenEXEC(@sql)SELECT@DataBase=QUOTENAME(CONVERT(NVARCHAR(255),VALUE)),@sql=NULLFROM@smoPrimaryFilePropWHERECONVERT(NVARCHAR(255),PROPERTY)='Databasename'SELECT@sql=ISNULL(@sql+','+CHAR(13)+CHAR(10),'CreateDataBase'+@DataBase+'On'+CHAR(13)+CHAR(10))+'(FileName=N'''+@Path+RIGHT(RTRIM(FILENAME),CHARINDEX('\',REVERSE(RTRIM(FILENAME)))-1)+''')'FROM@SmoPrimayChildrenEXEC(@sql+'ForAttach')PRINTN'成功附加数据库:'+@DataBaseDELETEFROM@SmoPrimayChildrenDELETEFROM@smoPrimaryFilePropFETCHNEXTFROMcur_FileINTO@FileENDENDTRYBEGINCATCHDECLARE@ErrorNVARCHAR(2047)SET@Error=ERROR_MESSAGE()--RAISERROR50001@ErrorENDCATCHCLOSEcur_FileDEALLOCATEcur_FileGO/*************************************************************调用方式************************************************************/--usemaster--Go--Execsp_AttchDataBase--@Path='E:\100.其他\测试',--nvarchar(1024)--@DataFiles=NULL,--nvarchar(max)--@SplitStr=NULL--nvarchar(50)
感谢你能够认真阅读完这篇文章,希望小编分享的“MS SQLServer如何批量附加数据库”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。