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:\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 批量附加数据库的更多相关文章
- MS SQLServer 批量附加数据库 分类: SQL Server 数据库 2015-07-13 11:12 30人阅读 评论(0) 收藏
************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注释 ...
- 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合
在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...
- SqlServer批量压缩数据库日志-多数据库批量作业,批量备份还原
原文:SqlServer批量压缩数据库日志-多数据库批量作业,批量备份还原 --作业定时压缩脚本 多库批量操作 DECLARE @DatabaseName NVARCHAR(50) DECLARE @ ...
- SQLServer之附加数据库
附加数据库注意事项 必须首先分离数据库. 尝试附加未分离的数据库将返回错误. 附加数据库时,所有数据文件(MDF 文件和 LDF 文件)都必须可用. 如果任何数据文件的路径不同于首次创建数据库或上次附 ...
- Sqlserver 2012附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
环境: Win10系统 SQLSERver 2012 情况: 使用混合登陆方式,sa账户密码正确登陆后,附加.mdf文件出现此错误. 尝试解决方法一:使用管理员运行SQLSERver2012,sa账户 ...
- sqlserver 批量修改数据库表主键名称为PK_表名
1.我们在创建sqlserver得数据表的主键的时候,有时会出现,后面加一串随机字符串的情况,如图所示: 2.如果你有强迫症的话,可以使用以下sql脚本进行修改,将主键的名称修改为PK_表名. --将 ...
- 【SQLServer】附加数据库失败
一个参考:https://blog.csdn.net/zjx86320/article/details/25562361 如果类似Administrator.Everyone等都依照网上的权限改过之后 ...
- Sqlserver直接附加数据库和设置sa密码
1.exec sp_attach_db 'test','E:\db\test.mdf','E:\db\test_log.ldf' 2.sp_password Null,'123','sa' 推荐一个微 ...
- ORACLE重装之后恢复数据库,相当于sqlserver的附加数据库
在开发机器上经常会遇到重装系统的问题,重装之前如果ORACLE没有及时备份的话重装之后就纠结了,数据还原很头疼. 各种娘中只能找到一些ORACLE安装与重装系统前目录相同的解决办法,目录不同就没招了. ...
随机推荐
- BZOJ4873:[SHOI2017]寿司餐厅——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4873 https://www.luogu.org/problemnew/show/P3749 简要题 ...
- 洛谷 P4592 [TJOI2018]异或 解题报告
P4592 [TJOI2018]异或 题目描述 现在有一颗以\(1\)为根节点的由\(n\)个节点组成的树,树上每个节点上都有一个权值\(v_i\).现在有\(Q\)次操作,操作如下: 1 x y:查 ...
- poj:1850 Code(组合数学?数位dp!)
题目大意:字符的字典序依次递增才是合法的字符串,将字符串依次标号如:a-1 b-2 ... z-26 ab-27 bc-52. 为什么题解都是组合数学的...我觉得数位dp很好写啊(逃 f[pos][ ...
- Codeforces Round #340 (Div. 2)B
B. Chocolate time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- 初学VS的目录结构
工程目录下各文件的含义 一般大部分的文章可能介绍到上面就算结束了,但我这还没有.创建工程产生的各个文件都你知道是什么用的吗? 如果你是一个初学者,你可能会不知道(老手请跳过本文).Ok,我就带你逐一了 ...
- C++智能指针 unique_ptr
C++智能指针 unique_ptr unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现), 定义于 memory ...
- Java日期时间实用工具类
Java日期时间实用工具类 1.Date (java.util.Date) Date(); 以当前时间构造一个Date对象 Date(long); 构造函数 ...
- python递归读取目录列表
import os def listdirs(base): for line in os.listdir(base): fullpath = os.path.join(base,line) if os ...
- XSS攻击处理方案
1. XSS攻击基本概念 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏洞 ...
- 美国选举问题/完全背包/Knapsack
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Knap ...