当前位置: 代码迷 >> Sql Server >> 一个有意思的有关问题,(分不够可再加)
  详细解决方案

一个有意思的有关问题,(分不够可再加)

热度:21   发布时间:2016-04-27 17:44:31.0
一个有意思的问题,(分不够可再加)
请教各位我有用户库500个能否通过系统存储过程或者别的方法实现自动分离所有用户库`和自动附加所有的用户库`如何行请问这段SQL如何写?


------解决方案--------------------
--自动分离
declare @db varchar(10),@i int,@xh char(3)
set @i=1
while @i <=500
begin
set @xh=right([email protected],3)
set @db= 'ZW0 '[email protected]
print @db
exec sp_detach_db @db
set @[email protected]+1
end
------解决方案--------------------
..........sp_detach_db

sp_detach_db
从服务器分离数据库,并可以选择在分离前在所有的表上运行 UPDATE STATISTICS。

语法
sp_detach_db [ @dbname = ] 'dbname '
[ , [ @skipchecks = ] 'skipchecks ' ]

--------------------------------------------学习
------解决方案--------------------
先确认数所有据库文件存放的磁盘位置有规律,数据库数据文件,日志文件也有规律才可以实践。
附加数据库的方法:
DECLARE @ForI int
DECLARE @dbnameX nvarchar(50) --数据库名
DECLARE @filenameX1 nvarchar(100) --数据文件
DECLARE @filenameX2 nvarchar(100) --日志文件
DECLARE @strFormat nvarchar(20)
DEClARE @DataPath nvarchar(100) --数据存放目录

BEGIN TRAN T1
SELECT @ForI=1,@DataPath=N 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\ '
WHILE @ForI <=500
BEGIN
SELECT @strFormat=dbo.FORMAT_STR(CAST(@ForI as nvarchar(10)),4)
,@dbnameX= 'ZW '[email protected]
,@[email protected]+ 'ZW '[email protected]+ '.mdf '
,@[email protected]+ 'ZW '[email protected]+ '_log.ldf '
,@[email protected]+1
/*
EXEC sp_attach_db @dbname = @dbnameX, --附加的过程
@filename1 = @filenameX1
@filename2 = @filenameX2
*/
--分离数据要使用到 系统存储过程sp_detach_db,
--但要判断当前是否是否在使用,
--要是使用先断开连接,才能分离成功
--SELECT @strFormat,@dbnameX,@filenameX1,@filenameX2,@ForI --调试语句
END
COMMIT TRAN T1


--======================
--用到的一个自定义函数内容:
/*===================================================
功能:格式化字符串 ,如输入01 自动生成 0000001
备注:当位数达到10以上,要另写算法,否则出错
设计:weiguohao
日期:2006-03-11
===================================================*/
CREATE FUNCTION FORMAT_STR
(@strX Nvarchar(20),@FormatLength INT)
RETURNS NVARCHAR(20) AS
BEGIN
DECLARE @Return NVARCHAR(20)
DECLARE @Length INT
SET @Length=LEN(@strX)
IF @Length> [email protected]
SET @[email protected]
ELSE
BEGIN
-- 格式化,只要是调用到数学函数POWER
SET @Return=CAST(RIGHT(POWER(10,@FormatLength),@[email protected]) AS NVARCHAR(20))[email protected]
END
RETURN @Return
END


  相关解决方案