使用Access执行Make Table查询以使用ODBC连接创建SQL Server表

时间:2014-02-12 00:29:23

标签: sql ms-access upsizing

我正在将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个这类查询。

1 个答案:

答案 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