Access形式でバックアップしたデータをSQL Serverに流し込むVBAスクリプト

火曜日 , 10, 11月 2020 Leave a comment

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

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください