使用Excel 2007 SQL进行INSERT INTO … SELECT的奇怪行为

接着。 我有这个VBScript脚本

Const inputfile = "New Microsoft Office Excel Worksheet (2).xlsx" dim ado: set ado = CreateObject("ADODB.Connection") ado.connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" _ & inputfile & """;Extended Properties=""Excel 12.0 Xml;HDR=YES"";" ado.CursorLocation = 3 ado.open ado.Execute "INSERT INTO [recalculated] ([TIME PERIOD]) " & _ "SELECT Format(CDate(Mid([TIME PERIOD], 8, 13)), 'mm/dd/yyyy') " & _ "AS [TIME PERIOD] FROM [input]" ado.close 

工作簿中的表是其自己的工作表中的命名范围

input

输入表

recalculated (即具有相同列名的空白表):

重新计算表

脚本运行时不会产生错误,但是数据将被插入到input表中而不是recalculated

产生输入表

(我注意到,这实际上是不同的行为,我以前看到的 – 我添加了TOP 3的SQL查询这个问题,因为最初的表被覆盖,而不是附加到)

但是,如果我改变expression其他东西,例如

 ado.Execute "INSERT INTO [recalculated] ([TIME PERIOD]) " & _ " SELECT TOP 3 'cheese' AS [TIME PERIOD] FROM [input]" 

它工作正常, recalculated填充和input保持原样。

任何人都知道发生了什么事,我该如何解决? 至less,有人可以重现这只是为了certificate我不是一个疯子吗?


我刚刚发现,如果工作簿已经在Excel中打开,脚本运行时,它就会按预期工作

当我运行代码,它的工作原理,我期望即插入到recalculated表。

这里是类似的脚本,重新创build你的场景,但使用从头开始创build一个新的工作簿:

 ' Const inputfile = "New Microsoft Office Excel Worksheet (2).xlsx" Const inputfile_with_path = "C:\New Microsoft Office Excel Worksheet (2).xlsx" Dim ado: Set ado = CreateObject("ADODB.Connection") ado.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" _ & inputfile_with_path & """;Extended Properties=""Excel 12.0 Xml;HDR=YES"";" ado.CursorLocation = 3 ado.Open ado.Execute "CREATE TABLE [input] ([TIME PERIOD] VARCHAR(255));" ado.Execute "INSERT INTO [input] VALUES ('WEEK OF JUN 21, 2010 (B)');" ado.Execute "INSERT INTO [input] VALUES ('WEEK OF JUN 07, 2010 (B)');" ado.Execute "INSERT INTO [input] VALUES ('WEEK OF JUN 21, 2010 (B)');" ado.Execute "INSERT INTO [input] VALUES ('WEEK OF JAN 04, 2010 (B)');" ado.Execute "INSERT INTO [input] VALUES ('WEEK OF JAN 04, 2010 (B)');" ado.Execute "CREATE TABLE [recalculated] ([TIME PERIOD] VARCHAR(255));" ado.Execute "INSERT INTO [recalculated] ([TIME PERIOD]) " & _ "SELECT Format(CDate(Mid([TIME PERIOD], 8, 13)), 'mm/dd/yyyy') " & _ "AS [TIME PERIOD] FROM [input]" ado.Close