【问题标题】:SQL INSERT function not working on imported dataSQL INSERT 函数不适用于导入的数据
【发布时间】:2014-06-11 14:46:38
【问题描述】:

所以我有一个 VBA 代码,它将 Excel 工作表作为新表导入 Access,从现有表中删除数据,然后使用 SQL INSERT 函数将数据从新表移动到现有表中以保留存在的关系。我有 3 张桌子,但由于某种原因,其中只有一张无法正常工作。代码似乎执行没有错误,但是当我打开表时没有数据。导入的表与我要插入的表在所有字段中具有相同的列名和相同的数据类型。有谁知道为什么只有一个表没有正确导入?下面是我正在使用的代码,而零件号是不起作用的:

SQL = "INSERT INTO [Reps] SELECT RepsX.* FROM RepsX;"
CurrentDb.Execute SQL
SQL = "INSERT INTO [Part Number] SELECT PartNumberX.* FROM PartNumberX;"
CurrentDb.Execute SQL
SQL = "INSERT INTO [Supplier link] SELECT SupplierLinkX.* FROM SupplierLinkX;"
CurrentDb.Execute SQL

我觉得这有点小,但我花了我一天的大部分时间试图弄清楚...

【问题讨论】:

  • PartNumberX 中的数据是什么样的?列是什么?
  • 我有 3 个数字列和 10 个文本列,它与 [Part Number] 表完全匹配,包括列上的名称。
  • “SELECT SupplierLinkX.* FROM SupplierLinkX;”的结果是什么?另外,[供应商链接]是正确的表名,还是应该是[供应商链接](这将与您的其他表名更加一致。
  • 它给了我一份 SupplierLinkX 表的精确副本。实际上,运行直接选择查询: SELECT PartNumberX.* FROM PartNumberX;返回所有正确的数据。所以我的猜测是 INSERT 函数要求我没有遵循一个规则,我只是不知道它是什么。

标签: sql excel vba ms-access ms-access-2007


【解决方案1】:

我不能给你一个明确的答案,只是建议:仔细检查Part Number表中列的数据类型,然后将它们与PartNumberX表中列的数据类型进行比较。 确保相应的列是兼容的,如果需要,可以使用内置的转换函数将PartNumberX 表列转换为适当的数据类型,如下所示。

另外,不要依赖源表和目标表之间的列顺序匹配——始终明确输入列名,如下所示:

insert into [Part Number] (c1, c2, ..., cn)
select cint(c1), cdbl(c2), ..., cstr(cn)
from PartNumberX

确保Part Number 表中的任何非空列(即不允许空值)确实总是得到非空值。如有必要,通过测试然后处理空值:

insert into [Part Number] (c1, ...)
select cint(iif(c1 is null, 0, c1)), ...
from PartNumberX

确保插入不违反任何参照完整性规则(关系)。您可以使用“数据库工具”>“关系”>“关系”命令直观地检查关系,然后单击“关系工具”>“设计”>“关系”>“所有关系”。

最后,您不必在 VBA 中运行插入查询。您可以轻松地运行它以在 Access 查询编辑器的 SQL 视图中对其进行测试。这将为您提供有关可能错误的更多反馈。

【讨论】:

  • 根据我将数据插入表的顺序,我一定违反了参照完整性规则。通过将 [part number] 表插入(取决于其他两个表)移动到最后,它可以完美地工作。感谢您的帮助!
【解决方案2】:

将 SQL 粘贴到查询窗口的 SQL 视图中并运行它。 应该有一条消息告诉您将附加多少条记录,或者如果没有附加原因。

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2022-01-02
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2017-01-12
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多