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

时间:2011-08-22 16:10:13

标签: sql excel vbscript

现在。我有这个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

input table

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

recalculated table

该脚本在不引发错误的情况下运行,但数据已插入input表而不是recalculated

resulting input table

(我注意到这实际上与我之前看到的行为不同 - 我将TOP 3添加到此问题的SQL查询中,因为最初该表已被覆盖而未附加到其中

但如果我将表达式更改为其他内容,例如

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

工作正常,recalculated已填充,input保持不变。

任何人都知道发生了什么以及如何解决这个问题?至少,有人可以复制这个只是为了证明我不是疯子吗?


我刚刚发现如果在运行脚本时工作簿已经在Excel中打开,这可以正常工作

1 个答案:

答案 0 :(得分:0)

当我运行代码时,它按照我的预期工作,即插入进入recalculated表。

这是类似的脚本,它重新创建您的场景,但使用从头开始创建的新工作簿:

' 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