我在一个工作簿(工作簿 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 的相同数据应该是日期?!
阅读这里的许多帖子,大多数用户似乎都希望字符串成为日期:我希望字符串保持为字符串!
在我的一生中,我已经研究并尝试了一切来解决这个问题,但我没有想法!
为了记录,我尝试了以下方法,但没有成功:
- 确保 Workbook A 和 Workbook B LASTMOD_BY 字段设置为 General
- 确保工作簿 A 和工作簿 B LASTMOD_BY 字段设置为文本
- 使工作簿中 LASTMOD_BY 字段中的数据成为数字,然后是文本字段(作为数字,LASTMOD_BY 会引发“溢出”错误,因为用户 ID 太大而不能成为日期值)
- 将另一个被接受为文本字段的表字段复制到 LASTMOD_BY 列中,并将其重命名为 LASTMOD_BY,并删除旧的 LASTMOD_BY 列。
- 在工作簿 A 和工作簿 B 中,在 LASTMOD_BY 之前的列中插入另一个名为 LASTMODBY 的字段,并提供 LASTMODBY 用户 ID 并从 SQL 语句中省略 LASTMOD_BY(Excel 仍然希望 LASTMODBY 是一个日期!)
- 测试表格单元格中的所有值以确保检测到正确的数据类型,然后确保它正确反映在 SQL 语法中(即,如果日期则格式为“日期”;如果文本格式为“文本”;如果数字格式(无单引号))
- 从 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!
如果有人能为我解决这个问题,我真的很感激!
干杯