0

我正在将 Access 2010 数据库升级到 SQL 服务器。有一个可更新的“制作表”查询运行以创建一个表并填充它。目前,它在另一个 ACCDB 文件中填充一个后端表。我已将所有后端表移至 SQL Server 并尝试更改查询以在 SQL Server 上创建表。

我从 Destination DB 属性中删除了 ACCDB 文件的路径,并在 Dest Connect Str 属性中放入了一个 ODBC 连接字符串。

当我运行查询时,我得到了错误

ODBC 调用失败 数据库中已经有一个对象名称 'MyTableName' (#2714)

我先删除 SQL 服务器上的表,然后运行它工作的查询。如果使用本地表,它将正确删除该表,重新创建它,然后填充它。使用 ODBC 连接似乎无法先将其删除,从而使 Make Table 无用。

我将远程表配置为 Access 中的链接表,希望有一种方法可以直接使用它,而无需再次重新指定连接字符串。这似乎也不可能。

寻找此问题的解决方案或任何可能的替代方案。我有近 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 回答