Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Anexar vários bancos de dados usando T-SQL


Usando o modo SQLCMD, você pode facilmente criar um script:
:setvar dbname YourDatabaseName
:setvar dbfile N'E:\DATA\YourDatabase.mdf'
:setvar logfile N'E:\TLOG\YourDatabase_log.ldf'
USE [master]
GO

CREATE DATABASE $(dbname) ON 
( FILENAME = $(dbfile) ),
( FILENAME = $(logfile) )
FOR ATTACH
GO

Isso funciona em sqlcmd.exe a partir da linha de comando (você pode até fornecer os valores para as variáveis ​​dbname, dbfile, logfile a partir da linha de comando também), ou funciona no SQL Server Management Studio se você ativou Tools > Options > Query Execution > by default, open new queries in SQLCMD mode .

Leia mais sobre o utilitário SQLCMD e todos os seus parâmetros no MSDN.

PS:claro, esta abordagem com um script habilitado para SQLCMD também funciona para ciclos BACKUP/RESTORE :-) (conforme recomendado por Aaron)

PPS:se você tiver uma boa convenção de nomenclatura e o arquivo de dados for sempre $(dbname).mdf e o arquivo de log é sempre $(dbname)_log.ldf , você também pode usar este script SQLCMD abreviado:
:setvar dbname YourDatabaseName
USE [master]
GO

CREATE DATABASE $(dbname) ON 
( FILENAME = N'E:\DATA\$(dbfile).mdf' ),
( FILENAME = N'E:\TLOG\$(logfile)_log.ldf' )
FOR ATTACH
GO

e, em seguida, basta chamar isso na linha de comando:
C:\>  sqlcmd.exe -S yourserver -E -i attach.sql -v dbname=YourDb1

e assim por diante, uma vez para cada banco de dados que você precisa anexar novamente.

PPPS:se você deseja restaurar backups, é um pouco mais complicado:
:setvar dbname YourDatabaseName
USE [master]
GO

RESTORE DATABASE $(dbname)
FROM DISK = N'E:\Backup\$(dbname).bak' 
WITH FILE = 1,  
MOVE N'$(dbname)' TO N'E:\DATA\$(dbname).mdf',  
MOVE N'$(dbname)_Log' TO N'E:\TLOG\$(dbname)_Log.ldf',  
NOUNLOAD, REPLACE
GO

Isso funciona, desde que você nomeie seu .bak arquivos iguais ao nome do seu banco de dados, e você os coloca em um local fixo (presumi E:\Backup aqui - adapte conforme necessário).