MS SQLServer 批量附加数据库的方法
技术百科
一个新手
发布时间:2017-10-18
浏览: 次 /************************************************************
* 标题: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'' + REPLACE(@DataFiles, @SplitStr, N' ') +
N' '
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)
# 基础上
# 是否正确
# 列表中
# Null
# 分隔符
# 不规范
# 数据库文件
# sqlserver
# 请根据
# ldf
# mdf
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Mac系统更新下载慢或失败怎么办_解决macOS升
- 如何使用Golang实现容器自动化运维_Golan
- Windows7如何安装系统镜像_Windows7
- 如何在 ACF 中正确更新嵌套多层的 Group
- php中self::能调用子类重写的方法吗_静态绑
- Python数据挖掘核心算法实践_聚类分类与特征工
- 如何在 Django 中安全修改用户密码而不使会话
- php后缀怎么变mp4能播放_让php伪装mp4正
- php订单日志怎么记录物流_php记录订单物流变更
- c# 如何深拷贝和浅拷贝
- Windows10如何更改日期格式_Win10区域
- Win11怎么自动隐藏任务栏_Win11全屏显示设
- 短链接还原php提示内存不足_调整PHP内存限制设
- c# 在高并发下使用反射发射(Reflection
- Go 语言标准库为何不提供泛型切片的 Contai
- 微信企业付款回调PHP怎么接收_处理企业付款异步通
- 如何从 Go 的 map[string]inter
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- Win10怎样设置多显示器_Win10多显示器扩展
- Win11怎么更改鼠标指针方案_Windows11
- Win11怎么制作U盘启动盘_Win11原版系统安
- 为什么Go建议使用error接口作为错误返回_Go
- c++ stringstream用法详解_c++字
- Windows Defender扫描失败怎么办_安
- Python实现图数据库操作_Neo4j核心CRU
- php内存溢出怎么排查_php内存限制调试与优化方
- Windows怎样关闭桌面弹窗广告_Windows
- 如何在Golang中引入测试模块_Golang测试
- Win11如何暂停系统更新 Win11暂停更新最长
- 如何使用Golang反射创建map对象_动态生成键
- c++怎么编写动态链接库dll_c++ __dec
- PyTorch DDP 多进程训练在 Kaggle
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- 如何在Golang中使用内置函数_Golangle
- 如何解决Windows时间不准的问题?(自动同步设
- Win11如何设置开机问候语 Win11修改登录界
- MAC如何安装Git版本控制工具_MAC开发环境配
- Win11怎么把图标拖到任务栏_Win11固定应用
- c# 在高并发场景下,委托和接口调用的性能对比
- Python装饰器复用技巧_通用能力解析【教程】
- 如何使用Golang实现文件追加操作_向已有文件追
- Windows蓝屏错误0x00000018怎么处理
- Win11怎么关闭OneDrive同步_Win11
- php删除数据怎么软删除_添加is_del字段标记
- Win11声音太小怎么办_Windows 11开启
- Win11怎么关闭专注助手 Win11关闭免打扰模
- 如何使用Golang搭建Web开发环境_快速启动H
- PythonWeb前后端整合项目教程_FastAP
- Win11怎么查看电脑配置_Win11硬件配置详细
- Mac的“调度中心”与“空间”怎么用_Mac多桌面

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'
QQ客服