我正在将Access 2010数据库升迁到SQL Server。有一个可更新的“生成表”查询,用于创建表并填充它。目前,它填充另一个ACCDB文件中的后端表。我已将所有后端表移动到SQL Server并尝试更改查询以在SQL Server上创建表。
我从Destination DB属性中删除了ACCDB文件的路径,并在Dest Connect Str属性中放入了ODBC连接字符串。
当我运行查询时,我收到错误
ODBC调用失败数据库中已存在对象名称“MyTableName”(#2714)
我首先删除SQL服务器上的表,然后运行它运行的查询。如果使用本地表,它将正确删除表,重新创建它,然后填充它。使用ODBC连接,它似乎无法首先删除它,从而使Make Table无用。
我将远程表配置为Access中的链接表,希望有一种方法可以直接使用它,而无需再次重新指定连接字符串。这似乎也不可能。
寻找解决方案或此问题的任何可能替代方案。我有近20个这类查询。
答案 0 :(得分: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