SQL ServerのバックアップをAccess形式で取り、そのバックアップを別のSQL Serverに流し込もうとしたのですが、SQL Server Management Studioではデータ型の問題などで単純に流し込むことができませんでした。
そこで、バックアップを取ったAccessファイルに流し込みたいSQL Serverへのリンクテーブルを作成しデータ型の変換などの問題をAccessにまかせてデータを流し込むことにしました。
このスクリプトはSQL Serverへデータを流し込む作業を省力化するために作成したものです。
Accessのメニューから『データベースツール』-『Visual Basic』でVBAの編集画面を開き、適当な『標準モジュール』に下記のソースを貼り付けます。
VBA編集画面の『実行』-『Sub/ユーザーフォームの実行』から実行、またはイミディエイトウインドウで『CopyData』と入力しENTERキーで実行します。
テーブルのプレフィクス部分(スキーマ名)を変えればPostgreSQLなどSQL Server以外のデータベースでも使用できると思います。
Option Compare Database Option Explicit ' リンクテーブルにつけられるプレフィクス(スキーマ名) Const TABLE_PREFIX = "dbo_" '------------------------------------------------------------------------ ' Accessのデータをリンクテーブルに流し込むスクリプト '------------------------------------------------------------------------ ' ' コピー元とコピー先のテーブル構造が同じ(項目名が同一、データ型は互換性が ' ある型)であること、ベースとなるテーブル名が同じでコピー先のテーブル名には ' プレフィクスが付いていることを前提とする ' ' 例) テーブル『M_社員』 ' ' コピー元(Access): M_社員 ' コピー先(SQL Server): dbo_M_社員 ' ' Accessのテーブル群の中からプレフィクス付きのテーブルを探し、プレフィク ' スを取り除いたテーブルをコピー元としてSQL文「INSERT INTO コピー先 ' SELECT * FROM コピー元」を実行する ' Sub CopyData() Dim tbl As TableDef Dim name As String Dim sql As String For Each tbl In CurrentDb.TableDefs If Left(tbl.name, Len(TABLE_PREFIX)) = TABLE_PREFIX Then 'ベースのテーブル名を決定 name = Mid(tbl.name, Len(TABLE_PREFIX) + 1) Debug.Print (name) ' コピー先テーブルの現在のデータを削除 sql = "delete from " & tbl.name Debug.Print (vbTab & sql) CurrentDb.Execute (sql) ' コピー元からコピー先へデータをコピー sql = "insert into " & tbl.name & " select * from " & name Debug.Print (vbTab & sql) CurrentDb.Execute (sql) End If Next End Sub
Please give us your valuable comment