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