【问题标题】:VBA: Import table from Excel into SQLVBA:将表格从 Excel 导入 SQL
【发布时间】:2013-03-27 04:44:34
【问题描述】:

我正在尝试使用 VBA 将数据表从 excel 导入 SQL Server 2012。
最好借助 UDF。

excel 表格看起来像这样。

TableID    2012  2011  2010  2009
row 1       11     12   13    14
row 2       21     22   23    24
row 3       31     32   33    34
etc..

(我将数字放在单元格中以指定它们的位置。例如 11 = 第 1 行,第 1 列)

数据库表看起来像这样。

Header:        id   |  year  |  row1  |  row2  |  row3  |  etc..
ExampData:  TableId    2012      11       21       31       ..
ExampData:  TableId    2011      12       22       32       ..

(这不包括主键列,它可以是 id 和年份的组合,也可以是 NEWID()


我知道如何导入特定的列,例如我可以运行以下代码:

INSERT INTO example_table (id, year, row1, row2, row3) VALUES ('001', '2012', '11', '21', '31')

这对单个列非常有用,但我该如何让它适用于整个表(多列和多行)。

【问题讨论】:

  • 这是一次还是不经常运行的操作?如果是这样,那么您不必太担心效率。那是除非有很多行要导入。为什么要提高效率?
  • 它会定期,每天 - 一天多桌。

标签: sql excel vba adodb


【解决方案1】:

所以我设法让它工作。这是使用 Excel 2010、SQL Sever 2012。
这假设 excel 中的行标题与 sql 中的列标题相同。
这也假设表格的布局与问题帖子中的类似。


要将数据从 Excel 导入 SQL 服务器,我们可以使用 UDF 执行以下操作。
在excel中创建Public Function

Public Function import_data(TableID, vHeader As Variant, vRow As Variant, vData As Variant)
End Function

并使用您喜欢的连接方式连接到数据库。
然后对于INSERT 语句,使用以下语句:

'Declare the  variables
Dim vpush As String
Dim headerCount As Long
Dim rowTitles As String
Dim rowDatas As String
Dim i As Long

`Count the amount of columns 
headerCount = Application.CountA(vHeader)

`Create insert statement
For i = 1 To headerCount
   rowTitles = VBA.Join(WorksheetFunction.Transpose(vRow), ", ")
   rowDatas = VBA.Join(WorksheetFunction.Transpose(Application.Index(vData, , i)), "', '")
   vpush = "INSERT INTO example_table (id, " & rowTitles & ", year) VALUES ('" & TableID & "', '" & rowDatas & "', '" & vHeader(i) & "')"
Next i

别忘了.Execute (vpush)

与任何时候你想导入表格相比,你将在 Excel 工作表中执行以下操作:

  1. 在单元格中输入=import_data(,然后按CTRL + SHIFT + A
  2. 选择表ID
  3. 选择标题行(此处假定始终为年份)
  4. 选择包含所有行标题的列(这将是您的 sql 中的标题)
  5. 选择表中的所有数据

应该这样做。
(P.S. 如果这不是最有效的方式,或者您看到了改进......请随时编辑或添加)

【讨论】:

    【解决方案2】:

    如果您使用的是 SQL Server 2008 或更高版本,则可以在 INSERT 语句中放置多行:

    INSERT INTO example_table (id, year, row1, row2, row3)
    VALUES ('001', '2012', '11', '21', '31'),
       ('002', '2012', '12', '22', '32'),
       ('003', '2012', '13', '23', '33')
    

    根据电子表格的大小,您可以在一个较大的 INSERT 或几个较小的 INSERT 中完成。

    【讨论】:

    • 谢谢!是否可以将 VALUES 行设为变量?我从来不确定会有多少行。像INSERT INTO example_table (id, year, row1, row2, row3) VALUES Var(i) 这样的东西有用吗?然后使用For i = 1 to NumRows
    猜你喜欢
    • 2021-02-25
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多