遍历数据库的未公开存储过程sp_MSforeachdb应用之Attach数据库
2006-08-18 16:46
661 查看
sp_MSforeachdb是SQL Server2k的Master库的未公开存储过程,其作用是遍历SQL实例下多个数据库,执行相应脚本。
比如想知道各数据库的物理文件存放路径和文件名,可以执行如下语句:
exec sp_msforeachdb 'select * from ?.dbo.sysfiles'
?就是该存储过程用来替换的DB名称
对于DBA来说,迁移数据库是很经常的事情,常用的方法是停服务后拷贝mdf和ldf到目标服务器,量少时还可以手工操作,量大了就只能使用脚本,有时候一台服务器上有几十个数据库,这时下面的脚本就有了用武之地。
--首先创建接受db信息的临时表
create table DBFileInfo
( dbName varchar(100) null,
fName varchar(255) null)
--将查询结果插入到表中
exec master.dbo.sp_MSforeachdb 'insert into DBFileInfo (dbName,fName) select N''?'',filename from ?.dbo.sysfiles'
--后期处理,比如生成Attach数据库脚本
--第一个语句的filename序号有问题
DECLARE @dbName varchar(100),@fName varchar(255), @dbName0 varchar(100),@fileCount as tinyint
DECLARE cur CURSOR
FOR SELECT dbname,fname FROM DBFileInfo order by 1
DECLARE @count smallint
SELECT @count = 1
SELECT @fileCount = 1
OPEN cur
FETCH NEXT FROM cur INTO @dbname,@fname
select @dbName0=@dbName
print 'EXEC sp_attach_db @dbname=''' +@dbname + ''''
WHILE (@@fetch_status <> -1)
BEGIN
if @dbName <> @dbname0
begin
SELECT @fileCount = 1
print 'go'
print 'EXEC sp_attach_db @dbname=''' +@dbname + ''''
print ',@filename'+ convert(varchar,@fileCount) +' = ''' +rtrim(@fname) + ''' '
SELECT @fileCount = @fileCount+1
end
else
begin
print ',@filename'+ convert(varchar,@fileCount) +' = ''' +rtrim(@fname) +''' '
end
select @dbName0=@dbName
FETCH NEXT FROM cur INTO @dbname,@fname
SELECT @count = @count + 1
END
print @count
CLOSE cur
DEALLOCATE cur
比如想知道各数据库的物理文件存放路径和文件名,可以执行如下语句:
exec sp_msforeachdb 'select * from ?.dbo.sysfiles'
?就是该存储过程用来替换的DB名称
对于DBA来说,迁移数据库是很经常的事情,常用的方法是停服务后拷贝mdf和ldf到目标服务器,量少时还可以手工操作,量大了就只能使用脚本,有时候一台服务器上有几十个数据库,这时下面的脚本就有了用武之地。
--首先创建接受db信息的临时表
create table DBFileInfo
( dbName varchar(100) null,
fName varchar(255) null)
--将查询结果插入到表中
exec master.dbo.sp_MSforeachdb 'insert into DBFileInfo (dbName,fName) select N''?'',filename from ?.dbo.sysfiles'
--后期处理,比如生成Attach数据库脚本
--第一个语句的filename序号有问题
DECLARE @dbName varchar(100),@fName varchar(255), @dbName0 varchar(100),@fileCount as tinyint
DECLARE cur CURSOR
FOR SELECT dbname,fname FROM DBFileInfo order by 1
DECLARE @count smallint
SELECT @count = 1
SELECT @fileCount = 1
OPEN cur
FETCH NEXT FROM cur INTO @dbname,@fname
select @dbName0=@dbName
print 'EXEC sp_attach_db @dbname=''' +@dbname + ''''
WHILE (@@fetch_status <> -1)
BEGIN
if @dbName <> @dbname0
begin
SELECT @fileCount = 1
print 'go'
print 'EXEC sp_attach_db @dbname=''' +@dbname + ''''
print ',@filename'+ convert(varchar,@fileCount) +' = ''' +rtrim(@fname) + ''' '
SELECT @fileCount = @fileCount+1
end
else
begin
print ',@filename'+ convert(varchar,@fileCount) +' = ''' +rtrim(@fname) +''' '
end
select @dbName0=@dbName
FETCH NEXT FROM cur INTO @dbname,@fname
SELECT @count = @count + 1
END
print @count
CLOSE cur
DEALLOCATE cur
相关文章推荐
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- sp_MSforeachdb获得所有的数据库的存储空间
- 系统存储过程sp_MSforeachtable和sp_MSforeachdb
- (SqlServer)不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解
- 微软不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解-统计数据库-记录数-容量-存储过程脚本等
- (SqlServer)不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解
- 两个有用的,ms未公开的存储过程sp_MSforeachDB,sp_MSforeachtable
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- 使用非正式的存储过程 sp_MSforeachdb
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- 与存储过程sp_MSforeachdb类似的存储过程sp_MSforeachdb
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- 详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
- 系统存储过程sp_MSforeachtable和sp_MSforeachdb
- 【推荐】(SqlServer)不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解
- 不公开存储过程sp_Msforeachtable与sp_Msforeachdb详解
- 一个值得研究的系统存储过程 sp_MSforeachtable