3

我在一个工作簿(工作簿 A)中使用 Excel (2013) 表,并且我正在使用 SQL INSERT INTO 将工作簿 A 中的一整行数据提取到工作簿 B 中的相同 Excel 表中。工作簿 B 通常会在此期间关闭操作,因此使用数据库连接(读取和写入)和 SQL 是最好的途径。我在 Excel 中使用本机 SQL 引擎,而不是外部数据库引擎。

工作簿 A 中的 Excel 表有 73 个字段,其中包含文本、数字和日期 (DMYHMS) 的混合,尽管该表主要是为通用格式设置的。工作簿 B 是连接到它的工作簿 A 集合的中央数据库。目前,我只测试从工作簿 A 到工作簿 B 的一个连接。

在工作簿 A 中,当我执行 SQL 时INSERT INTO出现错误:

“标准表达式中的数据类型不匹配。” (错误=-2147217913)

经过仔细的消除过程,我现在可以得出结论,工作簿 A 中有一个字段(第 71 个字段)导致了问题,这是“LASTMOD_BY”,它是一个用户 ID,即“12345678”,但是对于一些未知的原因,工作簿 B 预计是一个日期。这特别奇怪,因为我有一个 SUB_BY 字段(提交者),它也是一个用户 ID '12345678',它被接受为文本字符串。为什么 Excel 表会认为 LASTMOD_BY 的相同数据应该是日期?!

阅读这里的许多帖子,大多数用户似乎都希望字符串成为日期:我希望字符串保持为字符串!

在我的一生中,我已经研究并尝试了一切来解决这个问题,但我没有想法!

为了记录,我尝试了以下方法,但没有成功:

  1. 确保 Workbook A 和 Workbook B LASTMOD_BY 字段设置为 General
  2. 确保工作簿 A 和工作簿 B LASTMOD_BY 字段设置为文本
  3. 使工作簿中 LASTMOD_BY 字段中的数据成为数字,然后是文本字段(作为数字,LASTMOD_BY 会引发“溢出”错误,因为用户 ID 太大而不能成为日期值)
  4. 将另一个被接受为文本字段的表字段复制到 LASTMOD_BY 列中,并将其重命名为 LASTMOD_BY,并删除旧的 LASTMOD_BY 列。
  5. 在工作簿 A 和工作簿 B 中,在 LASTMOD_BY 之前的列中插入另一个名为 LASTMODBY 的字段,并提供 LASTMODBY 用户 ID 并从 SQL 语句中省略 LASTMOD_BY(Excel 仍然希望 LASTMODBY 是一个日期!)
  6. 测试表格单元格中的所有值以确保检测到正确的数据类型,然后确保它正确反映在 SQL 语法中(即,如果日期则格式为“日期”;如果文本格式为“文本”;如果数字格式(无单引号))
  7. 从 INSERT INTO 语句中遗漏了 LASTMOD_BY(确实有效),然后添加了一个单独的 UPDATE 语句来设置 LASTMOD_BY 字段(这不起作用)。

如何让工作簿 B 中的 Excel 表接受用户 ID ('LASTMOD_BY') 作为文本而不是日期?

这让我发疯了,我开始得出结论,Excel 表在与嵌入式 SQL 引擎一起使用时存在错误。

对于那些需要查看 SQL 的人,这里是:

INSERT INTO [CQDB$] (ProductQ, Version, QID_1, QID_2, QID_3, QID_4, QID_5, QID_6, QID_7, QID_8, QID_9, QID_10, QID_11, QID_12, QID_13, QID_14, QID_15, QID_16, QID_17, QID_18, QID_19, QID_20, QID_21, QID_22, QID_23, QID_24, QID_25, QID_26, QID_27, QID_28, QID_29, QID_30, QID_31, QID_32, QID_33, QID_34, QID_35, QID_36, QID_37, QID_38, QID_39, QID_40, QID_41, QID_42, QID_43, QID_44, QID_45, QID_46, QID_47, QID_48, QID_49, QID_50, QID_51, QID_52, QID_53, QID_54, QID_55, QID_56, QID_57, QID_58, QID_59, QID_60,  QID_61, QID_62, QID_63, QID_64, QID_65, SUB_DMYHM, SUB_BY, LASTMOD_DMYHM, LASTMOD_BY, RECSTATUS, SubMonth)
VALUES('NonBank', 6, 98765432, ‘Mr Smith',12348765,’My Insurance plan','0',’My Local Branch','0','0','29-Sep-16','30-Dec-09’, '0', '0', 'No', '0', '0', '0', '0', '0', '0', '0', 'No', 'Yes', '0', '0', '0', '0', '0', '0', 'N/A', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 12345678, ‘28-Sep-16 11:09:00', '0', '0', ‘28-Sep-16 11:09:29', 12345678, ‘28-Sep-16 11:09:29', 12345678, 'FAIL: To Follow-up',’01-Sep-16')

仅供参考,SQL 是使用 VBA 构建的。您在上面看到的是我手动编辑的版本(删除任何真实数据)。如果您发现缺少/多余的逗号等,它可能来自我的手动编辑,而不是生成的 SQL!

如果有人能为我解决这个问题,我真的很感激!

干杯

4

2 回答 2

1

乍一看; 您的数据中的分隔符在您的文本字段周围似乎不一致...我还没有进一步查看,但是您能否在手动编辑之前确认它们在您的 SQL 中是否一致?谢谢

于 2017-03-28T08:17:11.427 回答
0

对于这个问题,我没有找到满意的答案,我的意思是没有检测到错误然后更正。但是,我能够消除该问题。

我的结论已经确定了 Excel 表功能,即 Excel 表中的每个字段都可以由 Excel “确定”为基于该表中找到的大多数值的数据类型。

本文解释了这一点: ExcelTable 根据字段中输入的前 8 个值确定数据类型

我尝试删除表中的所有行并重新插入数据,但似乎 Excel 表对之前的内容有“记忆”,并将添加的新数据转换为日期格式。

但是,我认为这篇文章并不能完全解释我遇到的问题。考虑到 Excel 中的一个“错误”,即 Excel 将单元格格式化为日期。请参阅本文: Excel 将单元格格式设置为日期错误

我没有将整个工作簿格式化为日期,但在我的一些 SQL 更新中发生了这种情况。基本上,我所做的任何事情都无法让 Excel “忘记”它为工作簿 B 中的表格自动选择的先前日期格式。

解决方案

  1. 在工作簿 B 的表中插入一个全新的列。将其称为“列 1”。第 1 列被格式化为一般。
  2. 我重新运行了我的 SQL,并没有将用户 ID 写入 LASTMOD_BY,而是更改了 SQL 以将其放在“第 1 列”中。有效!用户 ID 作为用户 ID 而不是日期出现在“第 1 列”中。
  3. 现在,将 LASTMOD_BY 重命名为“Column 2”,并将“Column 1”重命名为 LASTMOD_BY。更改 SQL 以使“列 1”现在称为 LASTMOD_BY 并重新运行。它可以工作,现在用户 ID 作为用户 ID 而不是日期出现在 LASTMOD_BY 中。
  4. 最后,删除多余的 'Column 2'

此外,我随后将表格格式化为文本。我尝试了 ADO IMEX=1 标志,但这不起作用,所以我保持在 IMEX=0。

我所有的 SQL 查询现在都可以工作了。我在表格上应用了条件格式来整理条目的显示(不确定它们是否在每种情况下都有所不同,但皮带和大括号!)。

当我继续进行报告时,我可能需要使用高级过滤器并将文本转换为值/日期等,但这比 SQL 的黑盒更容易处理。

不是一个非常令人满意的答案,但我已经从我的工作簿中删除了这个损坏/异常。

于 2017-04-27T06:36:49.630 回答