9

サイズの異なる約 60 の SQL データベースを復元する必要があります。フォルダから 1 つずつ選択するだけで、すべてのデータベースを次々に復元するスクリプトを見つけるためにグーグルで検索しました。おそらく私はSQLなどにまったく慣れていないため、それほど成功しませんでした.

これは、powershell または sql コマンド ラインで実行できます。今のところ、次のようなことがわかりました。

RESTORE DATABASE [db1] FROM  DISK = N'C:\folder\db1.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 10
GO
RESTORE DATABASE [db2] FROM  DISK = N'C:\folder\db2.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 10
GO

したがって、特定のフォルダーからファイル名を取得し、「db1.bak」などをフォルダーから選択した名前に置き換えてから、スクリプトを実行します。

もっとスマートな方法があるに違いないことはわかっていますが、多くの .bak ファイルを SSMS に「ロード」して、プログラムが次々に実行されるようにすることは可能でしょうか?

4

5 に答える 5

2

ファイル名がデータベース名と一致する場合は、次のようなことができます。

DECLARE @FilesCmdshell TABLE (
    outputCmd NVARCHAR (255)
)   
DECLARE @FilesCmdshellCursor CURSOR 
DECLARE @FilesCmdshellOutputCmd AS NVARCHAR(255)

INSERT INTO @FilesCmdshell (outputCmd) EXEC master.sys.xp_cmdshell 'dir /B  C:\folder\*.bak'    
SET @FilesCmdshellCursor = CURSOR FOR SELECT outputCmd FROM @FilesCmdshell

OPEN @FilesCmdshellCursor
FETCH NEXT FROM @FilesCmdshellCursor INTO @FilesCmdshellOutputCmd
WHILE @@FETCH_STATUS = 0
BEGIN   
    DECLARE @cmd NVARCHAR(MAX) = 'RESTORE DATABASE [' + SUBSTRING(@FilesCmdshellOutputCmd, 0, CHARINDEX('.', @FilesCmdshellOutputCmd)) + '] FROM  DISK = N''C:\folder\' + SUBSTRING(@FilesCmdshellOutputCmd, 0, CHARINDEX('.', @FilesCmdshellOutputCmd)) + '.bak'' WITH  FILE = 1,  NOUNLOAD,  STATS = 10'
    EXEC(@cmd)

    FETCH NEXT FROM @FilesCmdshellCursor INTO @FilesCmdshellOutputCmd
END
于 2016-01-27T14:41:23.637 に答える