日期:2014-05-18  浏览次数:20668 次

一个有意思的问题,(分不够可再加)
请教各位我有用户库500个能否通过系统存储过程或者别的方法实现自动分离所有用户库`和自动附加所有的用户库`如何行请问这段SQL如何写?


------解决方案--------------------
--自动分离
declare @db varchar(10),@i int,@xh char(3)
set @i=1
while @i <=500
begin
set @xh=right(1000+@i,3)
set @db= 'ZW0 '+@xh
print @db
exec sp_detach_db @db
set @i=@i+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 '+@strFormat
,@filenameX1=@DataPath+ 'ZW '+@strFormat+ '.mdf '
,@filenameX2=@DataPath+ 'ZW '+@strFormat+ '_log.ldf '
,@ForI=@ForI+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> =@FormatLength
SET @Return=@strX
ELSE
BEGIN
-- 格式化,只要是调用到数学函数POWER
SET @Return=CAST(RIGHT(POWER(10,@FormatLength),@FormatLength-@Length) AS NVARCHAR(20))+@strX
END
RETURN @Return
END