excel - 使用 Excel VBA ADODB 从 CSV 批量导入到 SQL Server

标签 excel vba tsql csv adodb

我正在尝试将大量数据从 CSV 文件导入 SQL Sever 数据库表。我可以逐行写,但这需要太长时间。在 oComm.Execute 期间,我下面的内容在“FROM [C:\Temp\tblOPTExportData.csv]”上失败。任何帮助,将不胜感激。

On Error GoTo err_me
Dim locComm As New ADODB.Command
Dim locConnection As New ADODB.Connection
Dim locRst As New ADODB.Recordset
Dim ee As Boolean
Dim su As Boolean
Dim strSQLQuery As String
Dim shtDash As Worksheet
Dim shtData As Worksheet
Dim shtOP As Worksheet

With Application
    ee = .EnableEvents
    su = .ScreenUpdating
    If ee Then .EnableEvents = False
    If Not su Then .ScreenUpdating = True
End With

With ThisWorkbook
    Set shtDash = .Sheets("Dashboard")
    Set shtData = .Sheets("Data")
    Set shtOP = .Sheets("OP")
End With

With locConnection
    .CommandTimeout = 0
    .ConnectionString = "Provider=SQLOLEDB;Server=sql-ewhcld-1000; Database=xxxxxxxxxxxxxx; User ID=tenant-xxxxxxxxxxxxxxx; Password=yeahidontthinkso; Trusted_Connection=True; Pooling=True; MultipleActiveResultSets=False"
    .Open
End With

'    ____________________________
'   /                            \
'  |    IMS Factory Model Data    |
'   \____________________________/
'
'With statRng
'    .Value = "Factory Model Phase Data // Importing"
'    .Font.Color = 8421504
'    .Characters(Start:=29, Length:=9).Font.Color = 10192433 'Blue
'End With

With shtOP
    endRow = .Cells(.Rows.count, 2).End(xlUp).Row 'B (2)
End With
If endRow < 3 Then Err.Raise Number:=vbObjectError + 20002, Source:="exportData_Excel", Description:="No data found: 'OP' sheet, column 2 (B)."
If Not rangetoCSV("B3:K" & endRow, "tblOPTExportData", 201, , , "OP") Then Err.Raise Number:=vbObjectError + 30001, Description:="rangetoCSV, 'tblGates'"

strSQLQuery = "INSERT INTO optData (opsType, opsUID, opsDesc, opsProgram, opsFlight, opsProductAreaL1, opsAssignee, opsGenDate, opsECD, opsStatus) " & _
              "SELECT Type, UID, Description, Program, Flight, L-1 IPT, Assignee, Generated, ECD, Status FROM [C:\Temp\tblOPTExportData.csv]"

With oComm
    .ActiveConnection = locConnection
    .CommandText = strSQLQuery
    .Execute
End With

最佳答案

您需要使用 BULK INSERT而不是 INSERT INTO .尝试这样的事情:

strSQLQuery = "BULK INSERT optData " & _
              "FROM C:\Temp\tblOPTExportData.csv " & _
              "WITH (FIRSTROW = 2, FIELDTERMINATOR = ',', " & _
              "ROWTERMINATOR = '\n', TABLOCK)"  
    With oComm
        .ActiveConnection = locConnection
        .CommandType = adCmdText
        .CommandText = strSQLQuery
        .Execute
    End With

关于excel - 使用 Excel VBA ADODB 从 CSV 批量导入到 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24717720/

相关文章:

excel - 等待特定元素加载

c# - 在读/写模式下从 SharePoint 站点以 C# 编程方式打开 xls 电子表格

c# - 如何获得使用范围内的整个列?

excel - ALV网格只加载前64行,如何更改默认加载

excel - 如何将事件工作表的内容复制到新工作簿?

sql-server - 将日期名称(dw 脚本从 sqlserver 转换为 sqlite

vba - ADODB 记录集记录计数始终返回 -1

arrays - 是否可以将字典添加到 Excel VBA 中的数组?

sql-server - 用 THROW 替换 RAISERROR

sql-server - TABLESAMPLE 返回错误的行数?