/************************************************************
* 标题: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 SQLServer 批量附加数据库的更多相关文章

  1. MS SQLServer 批量附加数据库 分类: SQL Server 数据库 2015-07-13 11:12 30人阅读 评论(0) 收藏

    ************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注释 ...

  2. 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合

    在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...

  3. SqlServer批量压缩数据库日志-多数据库批量作业,批量备份还原

    原文:SqlServer批量压缩数据库日志-多数据库批量作业,批量备份还原 --作业定时压缩脚本 多库批量操作 DECLARE @DatabaseName NVARCHAR(50) DECLARE @ ...

  4. SQLServer之附加数据库

    附加数据库注意事项 必须首先分离数据库. 尝试附加未分离的数据库将返回错误. 附加数据库时,所有数据文件(MDF 文件和 LDF 文件)都必须可用. 如果任何数据文件的路径不同于首次创建数据库或上次附 ...

  5. Sqlserver 2012附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

    环境: Win10系统 SQLSERver 2012 情况: 使用混合登陆方式,sa账户密码正确登陆后,附加.mdf文件出现此错误. 尝试解决方法一:使用管理员运行SQLSERver2012,sa账户 ...

  6. sqlserver 批量修改数据库表主键名称为PK_表名

    1.我们在创建sqlserver得数据表的主键的时候,有时会出现,后面加一串随机字符串的情况,如图所示: 2.如果你有强迫症的话,可以使用以下sql脚本进行修改,将主键的名称修改为PK_表名. --将 ...

  7. 【SQLServer】附加数据库失败

    一个参考:https://blog.csdn.net/zjx86320/article/details/25562361 如果类似Administrator.Everyone等都依照网上的权限改过之后 ...

  8. Sqlserver直接附加数据库和设置sa密码

    1.exec sp_attach_db 'test','E:\db\test.mdf','E:\db\test_log.ldf' 2.sp_password Null,'123','sa' 推荐一个微 ...

  9. ORACLE重装之后恢复数据库,相当于sqlserver的附加数据库

    在开发机器上经常会遇到重装系统的问题,重装之前如果ORACLE没有及时备份的话重装之后就纠结了,数据还原很头疼. 各种娘中只能找到一些ORACLE安装与重装系统前目录相同的解决办法,目录不同就没招了. ...

随机推荐

  1. 【刷题】UOJ #79 一般图最大匹配

    从前一个和谐的班级,所有人都是搞OI的.有 \(n\) 个是男生,有 \(0\) 个是女生.男生编号分别为 \(1,-,n\) . 现在老师想把他们分成若干个两人小组写动态仙人掌,一个人负责搬砖另一个 ...

  2. Spring boot——构建rest风格

    前言rest风格严格意义上说不是一种标准,而是一种风格,在如今互联网界,这个风格被广泛用于微服务系统之间的交互. REST简单介绍 REST(Representional State Transfer ...

  3. 中国MOOC_面向对象程序设计——Java语言_第2周 对象交互_秒计时的数字时钟

    第2周编程题 查看帮助 返回   第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系 ...

  4. 使用canvas画一个雷达效果图的特效代码

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. 仅此一文让你明白ASP.NET MVC 之Model的呈现

    本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class HomeController : Controller { pu ...

  6. 细谈select函数(C语言)

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...

  7. stout代码分析之七:Result类

    Result类似于Option和Try类的组合,内部有三种状态 enum State { SOME, NONE, ERROR }; SOME表示Result对象有值 NONE表示Result对象值为空 ...

  8. 清除windows系统垃圾文件简易脚本(bat)

    @echo off      echo 正在清除系统垃圾文件,请稍等......      del /f /s /q %systemdrive%\*.tmp      del /f /s /q %sy ...

  9. array_pop 剔除最后一个数组元素

    <?php $a=array("red","green","blue"); print_r(array_pop($a)); //blu ...

  10. ps命令查看进程指定项目信息、用户名过长显示UID

    有次一个在使用ps命令时,发现部分用户显示的是用户名,有些用户显示的是UID,那是因为用户名长度超过8位的:也就是说ps命令用户名列默认只能显示8位(含8位)的用户名,超过8位就显示UID,如何让长度 ...