Para roubar uma das minhas próprias respostas :) usei com êxito esse script para migrar centenas de bancos de dados. (Este script requer conectividade de rede entre os servidores.)
@ECHO ON
set controlfile=control.txt
set oldserver=
set oldmdfpath=
set newmdfpath=
set newserver=
set oldlogpath=
set newlogpath=
set movedmdfpath=
set movedldfpath=
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (%controlfile%%) DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !line!
sqlcmd -E -S!oldserver! -Q"EXEC master.dbo.sp_detach_db @dbname = N'!line!'"
copy "!oldmdfpath!\!line!.mdf" !newmdfpath!
copy "!oldlogpath!\!line!_log.ldf" !newlogpath!
sqlcmd -E -S!newserver! -Q"CREATE DATABASE [!line!] ON ( FILENAME = N'!newmdfpath!\!line!.mdf' ),( FILENAME = N'!newlogpath!\!line!_log.ldf' ) FOR ATTACH"
move "!oldmdfpath!\!line!.mdf" !movedmdfpath!
move "!oldlogpath!\!line!_log.ldf" !movedldfpath!
ENDLOCAL
)
ENDLOCAL
(O arquivo control.txt contém uma lista dos bancos de dados a serem movidos. Você pode obtê-los via select name from sys.databases where name not in ('master','msdb','model','tempdb')
.)
Backup / restore é o método mais seguro, mas o destacamento / anexação é muito mais rápido quando você obtém um grande número de bancos de dados.
Você terá que lidar com logins (e possíveis problemas secundários) separadamente. Este link pode ajudar. Os links de Ditto JoeQwerty acima.