0

Access 2010 データベースを SQL サーバーにアップサイジングしています。テーブルを作成して埋めるために実行される更新可能な「テーブルの作成」クエリがあります。現在、別の ACCDB ファイルのバックエンド テーブルを埋めています。すべてのバックエンド テーブルを SQL Server に移動し、クエリを変更して SQL Server でテーブルを作成しようとしました。

Destination DB プロパティから ACCDB ファイルへのパスを削除し、Dest Connect Str プロパティに ODBC 接続文字列を挿入しました。

クエリを実行すると、エラーが発生します

ODBC 呼び出しに失敗しました データベースにオブジェクト名 'MyTableName' が既に存在します (#2714)

最初に SQL サーバー上のテーブルを削除してから、動作するクエリを実行します。ローカル テーブルを使用している場合は、テーブルが適切に削除され、再作成されてから埋められます。ODBC接続を使用すると、最初にそれを削除できないように見えるため、テーブルの作成が役に立たなくなります。

アクセスでリンクテーブルとして構成されたリモートテーブルがありますが、接続文字列を再度指定しなくても直接使用できる方法があることを望んでいました。これも無理そうでした。

この問題の解決策または可能な代替手段を探しています。このタイプのクエリは約 20 あります。

4

1 に答える 1

2

ODBC 外部データベースを対象とするテーブル作成クエリには、次のような.SQLプロパティがあります。

SELECT localTable.ID, localTable.textCol 
INTO (ODBC;DSN=myDb;Trusted_Connection=Yes;DATABASE=myDb;AutoTranslate=No;) externalTable
FROM localTable;

したがって、少しの VBA コードを使用してそのタイプのテーブル作成クエリを識別し、SQL Server にテーブルをドロップしてから、テーブル作成クエリを実行できます。だから、代わりに

DoCmd.OpenQuery "YourMakeTableQueryName"

(コードが現在そうしていると思われるように)使用できます

RunMakeTableQuery "YourMakeTableQueryName"

RunMakeTableQuery、標準の VBA モジュールで次のように定義されています。

Option Compare Database
Option Explicit

Public Sub RunMakeTableQuery(MakeTableQueryName As String)
    Dim cdb As DAO.Database, qdf As DAO.QueryDef, qdf2 As DAO.QueryDef
    Dim i As Long, j As Long, ConnectionString As String, TableName As String
    Const ExternalIntoTag = "INTO (ODBC;"

    Set cdb = CurrentDb
    Set qdf = cdb.QueryDefs(MakeTableQueryName)
    i = InStr(1, qdf.SQL, ExternalIntoTag, vbBinaryCompare)
    If i > 0 Then
        ' target table is external (SQL Server)
        i = i + Len(ExternalIntoTag)
        j = InStr(i, qdf.SQL, ")", vbBinaryCompare)
        ConnectionString = Trim(Mid(qdf.SQL, i, j - i))

        i = InStr(j + 1, qdf.SQL, "FROM", vbBinaryCompare)
        TableName = Trim(Mid(qdf.SQL, j + 1, i - j - 3))

        Set qdf2 = cdb.CreateQueryDef("")
        qdf2.Connect = "ODBC;" + ConnectionString
        qdf2.ReturnsRecords = False
        qdf2.SQL = "IF OBJECT_ID('" & TableName & "','U') IS NOT NULL DROP TABLE [" & TableName & "]"
        qdf2.Execute dbFailOnError
        Set qdf2 = Nothing
        qdf.Execute dbFailOnError
        Set qdf = Nothing
    Else
        ' target table is an Access table
        Set qdf = Nothing
        ' this will overwrite an existing target table with no prompts
        DoCmd.SetWarnings False
        DoCmd.OpenQuery MakeTableQueryName
        DoCmd.SetWarnings True
    End If
    Set cdb = Nothing
End Sub
于 2014-02-12T11:06:03.477 に答える