MS SQLServer 批量附加数据库
* 标题: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:\SQL2005\DE2\'
*/
--检查文件路径是否正确
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,