Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我在SQL INSERT中提供非日期字符串时,EXCEL表强制字段为日期_Sql_Excel_Data Formats_Vba - Fatal编程技术网

当我在SQL INSERT中提供非日期字符串时,EXCEL表强制字段为日期

当我在SQL INSERT中提供非日期字符串时,EXCEL表强制字段为日期,sql,excel,data-formats,vba,Sql,Excel,Data Formats,Vba,我在一个工作簿(工作簿A)中使用Excel(2013)表,并使用SQL INSERT INTO将整行数据从工作簿A导入工作簿B中相同的Excel表。在此操作过程中,工作簿B通常会关闭,因此使用数据库连接(读写)和SQL是实现此目的的最佳途径。我在Excel中使用本机SQL引擎,而不是外部db引擎 工作簿A中的Excel表有73个字段,这些字段包含文本、数字和日期(DMYHMS)的混合物,尽管该表主要是为通用格式设置的。工作簿B是连接到它的工作簿a集合的中央数据库。目前,我只测试从工作簿A到工作簿

我在一个工作簿(工作簿A)中使用Excel(2013)表,并使用SQL INSERT INTO将整行数据从工作簿A导入工作簿B中相同的Excel表。在此操作过程中,工作簿B通常会关闭,因此使用数据库连接(读写)和SQL是实现此目的的最佳途径。我在Excel中使用本机SQL引擎,而不是外部db引擎

工作簿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的相同数据应该是日期

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

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

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

  • 确保工作簿A和工作簿B LASTMOD_BY字段设置为 一般的
  • 确保工作簿A和工作簿B LASTMOD_BY字段设置为 正文
  • 将工作簿中LASTMOD_BY字段中的数据设置为数字和 然后,稍后,一个文本字段(作为一个数字,lastmodby)抛出一个 “溢出”错误,因为用户ID太大,不能作为日期值)
  • 将另一个被接受为文本字段的表字段复制到 LASTMOD_BY列并将其重命名为LASTMOD_BY,然后删除 按列列出的旧LASTMOD_
  • 在工作簿A和工作簿B中插入另一个名为 LASTMODBY之前的列中的LASTMODBY,并提供LASTMODBY 用户ID,并从SQL语句(Excel)中省略LASTMOD_BY 仍然希望LASTMODBY是约会对象!)
  • 测试表格单元格中的所有值以确保数据正确 检测类型,然后确保它正确反映在 SQL语法(即如果是日期,则格式为“日期”;如果是文本格式 作为“文本”;如果数字格式为数字(无单引号))
  • 从INSERT INTO语句中漏掉LASTMOD_BY 然后添加一个单独的UPDATE语句来设置 按字段的LASTMOD_(不起作用)
  • 如何使工作簿B中的Excel表接受用户ID(“LASTMOD_BY”)作为文本而不是日期

    这让我发疯,我开始得出结论,Excel表格在与嵌入式SQL引擎一起使用时,有一个bug

    对于那些需要查看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

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


    干杯

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

    我没有找到这个问题的令人满意的答案,我的意思是没有检测到任何故障,然后进行了纠正。然而,我能够解决这个问题

    我的结论是Excel表的一个功能,Excel表中的每个字段都可以根据该表中的大多数值“确定”为数据类型

    这篇文章解释了这一点:

    我尝试删除表中的所有行并重新插入数据,但EXCEL表似乎拥有以前的“内存”,并将添加的新数据转换为日期格式

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

    我没有将整个工作簿格式化为date,但是在我的一些SQL更新中有这样的元素。基本上,我所做的一切都不能让Excel“忘记”它为工作簿B中的表自动选择的上一个日期格式

    解决方案
  • 在工作簿B的表中插入一个全新的列。将其称为“第1列”。第1列的格式为“一般”
  • 我重新运行了我的SQL,并没有将用户ID写入LASTMOD_,而是更改了SQL,将其放入“第1列”。成功了!用户ID在“第1列”中显示为用户ID,而不是日期
  • 现在,将LASTMOD_BY重命名为“Column 2”,并将“Column 1”重命名为LASTMOD_BY。更改SQL,使“Column 1”现在由调用LASTMOD_并重新运行。它起作用了,现在用户ID作为用户ID而不是日期出现在LASTMOD_BY中
  • 最后,删除多余的“第2列”
  • 此外,我随后将表格格式化为文本。我尝试了ADO IMEX=1标志,但这不起作用,所以我保持IMEX=0

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

    当我转到报告时,我可能需要使用高级过滤器和将文本转换为值/日期等,但这比b更容易处理