Poniżej przedstawiam skrypt, który wygeneruje komendy T-SQL do podłączenia (attach) wszystkich baz danych użytkownika z wyszczególnieniem nazw plików baz wraz ze ścieżkami dostępu do nich.
Wygenerowany kod można potem edytować i pozmieniać np. litery dysków czy ścieżki dostępu.

Skrypt należy uruchomić przed odłączeniem baz danych.

-- attach all user databases 
-- Uwaga !!!
-- Skrypt należy użyć przed odłączeniem baz danych.
-- Przykład:
/*
 -- [demo_db]
 EXEC sp_attach_db @dbname = 'demo_db'
      ,@filename1 = 'C:\Program Files\Microsoft SQL Server\MSSQL16.SQL2022\MSSQL\DATA\demo_db.mdf'
      ,@filename2 = 'C:\Program Files\Microsoft SQL Server\MSSQL16.SQL2022\MSSQL\DATA\demo_db_log.ldf'
*/
-------------------------------------------------------------------------------------
 
USE [master];
GO
DECLARE @DatabaseName NVARCHAR(200) ,
    @sql_cmd NVARCHAR(4000) ,
    @file NVARCHAR(1000) ,
    @i INT

DECLARE DatabaseNameList_cur CURSOR STATIC LOCAL FORWARD_ONLY
FOR
    SELECT  RTRIM(LTRIM([name]))
    FROM    sys.databases
    WHERE   database_id > 4  -- only users databases
	AND STATE_DESC='ONLINE';
PRINT 'SERVER NAME : ' + upper(@@servername) + '--> Begin script databases'
PRINT '----------------------------------------------'
PRINT ''
PRINT ''
-- external cursor with databases list
OPEN DatabaseNameList_cur
FETCH NEXT FROM DatabaseNameList_cur INTO @DatabaseName
 
WHILE @@FETCH_STATUS = 0 
    BEGIN
        SET  @i = 1;
 
        SET @sql_cmd = '-- ' + QUOTENAME(@DatabaseName) + CHAR(10)
            + 'EXEC sp_attach_db @dbname = ''' + @DatabaseName + '''' + CHAR(10);
     
	    -- internal cursor with physical files name list for each database
	    DECLARE dbfiles_cur CURSOR STATIC LOCAL FORWARD_ONLY
        FOR
            SELECT  physical_name
            FROM    sys.master_files
            WHERE   database_id = DB_ID(@DatabaseName)
            ORDER BY [file_id];
 
        OPEN dbfiles_cur
 
        FETCH NEXT FROM dbfiles_cur INTO @file
 
        WHILE @@FETCH_STATUS = 0 
            BEGIN
                SET @sql_cmd = @sql_cmd + '    ,@filename'
                    + CAST(@i AS NVARCHAR(10)) + ' = ''' + @file + ''''
                    + CHAR(10);
                SET @i = @i + 1;
 
                FETCH NEXT FROM dbfiles_cur INTO @file
            END
        -- close inetrnal cursor
        CLOSE dbfiles_cur;
        DEALLOCATE dbfiles_cur;
        PRINT @sql_cmd;
 
        FETCH NEXT FROM DatabaseNameList_cur INTO @DatabaseName
    END
CLOSE DatabaseNameList_cur;
DEALLOCATE DatabaseNameList_cur;


PRINT '----------------------------------------------'
PRINT ''
PRINT ''
print 'SERVER NAME : ' + upper(@@servername) + '--> All databases successfully scripted'


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl