新手试图从 excel 将数据插入 SQL Server 2008

Posted

技术标签:

【中文标题】新手试图从 excel 将数据插入 SQL Server 2008【英文标题】:Newbie trying to insert data into SQL Server 2008 from excel 【发布时间】:2015-02-24 04:06:00 【问题描述】:

过去几天我一直在尝试,我一直在做的是谷歌搜索并尝试我能找到和测试的任何代码。我放弃了,希望这里的聪明人能帮助我。

我正在尝试将数据从 Excel 工作表加载到 SQL Server 中现有的表中。所有列和数据属性完全匹配。

当我运行脚本时,它会报错:

运行时错误“-2147217865 (80040e37)”: Microsoft Access 数据库引擎找不到对象“DATA_FOR_CUTTING”。确保对象存在并且正确拼写其名称和路径。如果“DATA_FOR_CUTTING”不是本地对象,请检查您的网络连接或联系服务器管理员

这是脚本(我使用的是 Excel 2010)

Sub Excel_To_SQL()
Dim con As ADODB.Connection
Dim con2 As New ADODB.Connection
Dim s As String
Dim s2 As String
Dim s3 As String
Dim WSP1 As Worksheet
Set con = New ADODB.Connection

Application.DisplayStatusBar = True
Application.StatusBar = "Contacting SQL Server..."

s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Users\xxx\Documents\xxx\xxxx\Book2.xlsx';" _
         & "Extended Properties=""Excel 8.0;HDR=Yes;IMEX=0;Readonly=False"";"
'                    'HDR = yes - to exclude header of excel file upon reading
con.Open s

s2 = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=xxx;Password=xxx;Initial Catalog=xxx;Data Source=xxxxx;"
con2.Open s2

s3 = "INSERT INTO dbo.DATA_FOR_CUTTING SELECT * FROM [Data_for_Cutting$]"
con.Execute s3

con.Close
Set con = Nothing

Application.StatusBar = "Data successfully loaded."
End Sub
#

我修复了连接字符串,没有更多错误,但它也没有任何作用。它没有读取工作表的内容,因此没有将行插入到 sql 表中。但是如果我执行“INSERT INTO ... VALUES (XXX)”命令,VALUES 将被插入到 SQL 表中,因此连接和命令正常工作。有人知道为什么它不阅读工作表吗?谢谢。

【问题讨论】:

你的表存在吗?检查给定的表格名称或您提供的工作表名称 您的电子表格是否有一个名为 Data_for_Cutting 的工作表? 我刚刚遇到了这个epplus.codeplex.com,看起来这可以帮助...很多例子。此外,您的错误提到了 Access DB,而您的叙述说 Excel 到 SQL 2008,您是否在 s 中使用了错误的提供程序。 嗨,是的,该表存在于 sql 中,并且在 excel 文件中有一个名为 Data_for_Cutting 的工作表。我会检查 epplus 网站。谢谢! 【参考方案1】:

就我个人而言,当我做这种事情时,我会将现有的列标题复制到 SQL Server 的单独工作表中。

然后我复制相应标题下的每一列数据。

然后从右键单击表格后的“编辑前 200 行”选项中,我从 excel 中粘贴数据。

【讨论】:

我认为我同意你的观点。但是 excel 选项卡由多个宏更新,几乎每天都更新,所以我必须提供一种自动将数据加载到 sql 的方法。 excel不是我的。谢谢。 是的,在一次性的基础上,它很棒。虽然不适合你所追求的【参考方案2】:

使用 Excel 的组合字符串功能来生成 SQL 怎么样?例如,假设我有这些单元格:

甲乙 姓名 电话 安德烈 555-555-4444 亚历克斯 555-555-3333

然后在 C2 单元格中,我可以输入

="insert into mytable(name, phone) values('"&A2&"','"&B2"');"

要处理 10,000 行这样的行,当然只需复制公式即可。

另一方面,要以编程方式执行此操作,您已经有一些代码可以连接到 SQL Server,因此您只需要将 Excel 中的范围转换为 SQL。假设我们假设我们的范围总是将 SQL 字段名称作为第一行,如上所示,那么这个宏就可以解决问题:

' Convert a named range to SQL insert statements. First row must have SQL field names.
Public Function RangeToSQL( _
            strExcelRangeName As String, _
            strSQLTableName As String, _
            Optional strSheetName As String = "Sheet1" _
            ) As String
    Dim rng As Range
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets(strSheetName)
    Set rng = sh.Range(strExcelRangeName)

    Dim i As Long, j As Long, vt As Variant, strFields As String, strValues As String
    For j = 1 To rng.Columns.Count
        strFields = strFields + IIf(j = 1, "", ",")
        strFields = strFields + rng.Cells(1, j).Value
    Next j
    For i = 2 To rng.Rows.Count
        strValues = strValues + IIf(i = 2, "", "," + vbCrLf)
        For j = 1 To rng.Columns.Count
            strValues = strValues + IIf(j = 1, "(", ",")
            vt = rng.Cells(i, j).Value
            strValues = strValues + IIf(IsNumeric(vt), CStr(vt), "'" + CStr(vt) + "'")
        Next j
        strValues = strValues + ")"
    Next i
    RangeToSQL = "insert into " + strSQLTableName + "(" + strFields + ") values " + strValues + ";"
End Function

对于上面显示的定义为命名范围的单元格,这会生成以下 SQL:

insert into whatevertable(Name,Phone) values ('Andrei','555-555-4444'),
('Alex','555-555-3333');

【讨论】:

感谢您的建议。该选项卡有数千行,并且每天都在变化。并且用户无权访问 sql,所以我必须从 excel 执行 sql 命令。 您可以编写一个宏,该宏基本上与我在上面描述的公式中做的事情相同。因此,您将遍历行,构建一组插入语句,并在完成迭代后通过您的连接发送一大批 SQL。你想要一个小示例代码吗? 我很想看到一个样本:)。谢谢! 更新帖子(示例)。【参考方案3】:

发现我使用的 SQL 版本是旧版本,它不适用于 2007(或更高版本),所以我必须使用 2003 版本。

【讨论】:

以上是关于新手试图从 excel 将数据插入 SQL Server 2008的主要内容,如果未能解决你的问题,请参考以下文章

将数据从excel插入sql表

SSIS - 将数据从 Excel 导出到 sql 表

将 Excel 单元格值插入现有 SQL 表 [重复]

如何将数据直接从 Excel 插入 Oracle 数据库

从Excel文件到SQLite数据库的SQLite插入循环

如何从 SQL *PLUS 中的批量插入中查找失败的插入语句