Generate sp_attach_db for all databases
Tagged:  •  

Quick and dirty, this sproc will generate the sp_attach_db T-SQL statement for a specified database...this coupled with sp_MsforEachDb '#script_attach ''?''' will generate the attach script for all databases on an instance:

CREATE PROCEDURE #script_attach(
@dbname sysname
)
AS
DECLARE @dbo sysname
SET NOCOUNT ON;

CREATE TABLE #tmp_files (name sysname, filename varchar(1024))
CREATE TABLE #tmp_dbo (dbname sysname, dbo sysname)

INSERT INTO #tmp_files
EXEC ('SELECT name, filename FROM [' + @dbname + '].dbo.sysfiles (nolock)')

INSERT INTO #tmp_dbo
EXEC('SELECT ''' + @dbname + ''', name
FROM master.dbo.syslogins
WHERE sid IN (SELECT sid FROM [' + @dbname + '].dbo.sysusers WHERE name = ''dbo'')')

DECLARE cur_file CURSOR
READ_ONLY
FOR SELECT LTRIM(RTRIM(name)), LTRIM(RTRIM(filename)) FROM #tmp_files

DECLARE @name sysname
DECLARE @filename varchar(1024)
DECLARE @i int
OPEN cur_file

SET @i = 1
PRINT 'EXEC master.dbo.sp_attach_db @dbname = ''' + @dbname + ''''
FETCH NEXT FROM cur_file INTO @name, @filename
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT CHAR(9) + ',@filename' + CAST(@i AS varchar) + ' = ''' + @filename + ''''
SET @i = @i + 1
END
FETCH NEXT FROM cur_file INTO @name, @filename
END

CLOSE cur_file
DEALLOCATE cur_file

-- Change dbo back
SELECT TOP 1 @dbo = dbo FROM #tmp_dbo
PRINT 'EXEC [' + @dbname + '].dbo.sp_changedbowner ''' + @dbo + ''''

DROP TABLE #tmp_files
DROP TABLE #tmp_dbo
GO