共计 3801 个字符,预计需要花费 10 分钟才能阅读完成。
自动写代码机器人,免费开通
这篇文章主要介绍了 MS SQLServer 如何批量附加数据库,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
/************************************************************
* 标题: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)
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“MS SQLServer 如何批量附加数据库”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!
向 AI 问一下细节
正文完