【问题标题】:Using Access to do a Make Table query to create a SQL Server table using ODBC connection使用 Access 执行 Make Table 查询以使用 ODBC 连接创建 SQL Server 表
【发布时间】:2014-02-12 00:29:22
【问题描述】:

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

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

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

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

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

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

寻找此问题的解决方案或任何可能的替代方案。我有近 20 个此类查询。

【问题讨论】:

  • 当您说“进行表查询”时,是一系列 SQL 查询(可能在一个过程中?),还是我们在谈论 VBA 或其他什么?如果列保持不变,您可能需要考虑切换到 TRUNCATE 而不是删除表。
  • 这是一个名为“制作表”的 Access 查询选项,它将在其中运行查询并创建表并填充表。 Is 只是 Access 通过在其查询生成器、向导等中填写其他属性创建的单个 SQL 查询。
  • @Ron 如果您可以从“生成表”转换为“追加查询”,请按照 jpmc26 的建议清空目标表,然后执行追加。
  • 不是访问专家,所以需要看看查询是如何被调用的,看看我是否可以在调用它之前挂钩并做空。希望 Access 会为此提供某种类型的挂钩。希望我可以修改查询并按原样工作,而不必返回调用和修改位置的代码,但可能没有这么幸运;)thx

标签: sql ms-access upsizing


【解决方案1】:

针对 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

【讨论】:

  • 谢谢,我想这可能是我必须走的路。我确实发现所有查询都是从宏调用的,所以我可以使用它以及向宏添加一些前置步骤来删除表。
  • 请注意,任何找到此页面的人正在寻找从 Access 到 SQL Server 的 Make-Table 查询查询示例...语法需要在 ODBC 连接周围用方括号编写和表名前的句点,不带空格。如果将该语法保存在 Access 查询中,然后稍后打开查询,则方括号将替换为圆括号并删除句点。它需要看起来像这样: SELECT localTable.ID, localTable.textCol INTO [ODBC;DSN=myDb; Trusted_Connection=是;数据库=我的数据库; AutoTranslate=No;].externalTable FROM localTable;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多