将数据从 Excel 导出到 SQL 服务器
Export data from Excel to SQL Server
我正在尝试使用多个表的 bcp
命令将数据从 Excel 推送到 SQL 服务器。目前我已经设置了我的代码,例如它创建了需要推送的数据文本文件(在循环中),然后 运行 下面提到的 bcp
命令
bcp dbname.schema_name.table_name out C:\table_name.txt -n -S localhost -U username -P password -b 10000
但是我想取消循环,并希望 运行 单个 bcp
命令将多个表的名称作为第一个参数,将不同的文本文件作为第二个参数。我试着在网上找到这个问题的解决方案,但一无所获。
任何帮助将不胜感激。
只是一些背景知识:我想取消循环和 运行 单个命令的原因是,我观察到我的代码有奇怪的行为,当我单步执行我的代码时,它是能够将所有数据推送到 SQL 服务器,但是当我通过单击分配了宏的按钮立即 运行 整个过程时,代码仍然 运行s 但不t 将任何数据推送到 SQL 服务器。
为了解决这个问题,我尝试将 doevents 放在 bcp
命令之后,但一切都是徒劳的,然后我在 bcp 命令之后设置了等待 5 秒,它似乎可以工作,但我觉得设置等待有点冒险,我永远不会确定等待时间应该是多少。
单个BCP命令只能将数据推送到单个table。无法将多个 table 名称传递给单个 BCP 命令。
用一个好的老式循环来处理任务没有错。
Sub Button1_Click()
Dim conn As New ADODB.Connection
Dim iRowNo As Integer
Dim sCustomerId, sFirstName, sLastName As String
With Sheets("Sheet1")
'Open a connection to SQL Server
conn.Open "Provider=SQLOLEDB;Data Source=ASUSBOOK\SQL2012;Initial Catalog=ExcelDemo;Integrated Security=SSPI;"
'Skip the header row
iRowNo = 2
'Loop until empty cell in CustomerId
Do Until .Cells(iRowNo, 1) = ""
sCustomerId = .Cells(iRowNo, 1)
sFirstName = .Cells(iRowNo, 2)
sLastName = .Cells(iRowNo, 3)
'Generate and execute sql statement to import the excel rows to SQL Server table
conn.Execute "insert into dbo.Customers (CustomerId, FirstName, LastName) values ('" & sCustomerId & "', '" & sFirstName & "', '" & sLastName & "')"
iRowNo = iRowNo + 1
Loop
MsgBox "Customers imported."
conn.Close
Set conn = Nothing
End With
End Sub
另外,看看这个 link。
https://www.excel-sql-server.com/excel-sql-server-import-export-using-vba.htm
如果循环方案对您来说太慢,请考虑将数据集保存为 CSV 文件并执行批量插入。
BULK
INSERT CSVTest
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
--Check the content of the table.
SELECT *
FROM CSVTest
GO
--Drop the table to clean up database.
DROP TABLE CSVTest
GO
我正在尝试使用多个表的 bcp
命令将数据从 Excel 推送到 SQL 服务器。目前我已经设置了我的代码,例如它创建了需要推送的数据文本文件(在循环中),然后 运行 下面提到的 bcp
命令
bcp dbname.schema_name.table_name out C:\table_name.txt -n -S localhost -U username -P password -b 10000
但是我想取消循环,并希望 运行 单个 bcp
命令将多个表的名称作为第一个参数,将不同的文本文件作为第二个参数。我试着在网上找到这个问题的解决方案,但一无所获。
任何帮助将不胜感激。
只是一些背景知识:我想取消循环和 运行 单个命令的原因是,我观察到我的代码有奇怪的行为,当我单步执行我的代码时,它是能够将所有数据推送到 SQL 服务器,但是当我通过单击分配了宏的按钮立即 运行 整个过程时,代码仍然 运行s 但不t 将任何数据推送到 SQL 服务器。
为了解决这个问题,我尝试将 doevents 放在 bcp
命令之后,但一切都是徒劳的,然后我在 bcp 命令之后设置了等待 5 秒,它似乎可以工作,但我觉得设置等待有点冒险,我永远不会确定等待时间应该是多少。
单个BCP命令只能将数据推送到单个table。无法将多个 table 名称传递给单个 BCP 命令。
用一个好的老式循环来处理任务没有错。
Sub Button1_Click()
Dim conn As New ADODB.Connection
Dim iRowNo As Integer
Dim sCustomerId, sFirstName, sLastName As String
With Sheets("Sheet1")
'Open a connection to SQL Server
conn.Open "Provider=SQLOLEDB;Data Source=ASUSBOOK\SQL2012;Initial Catalog=ExcelDemo;Integrated Security=SSPI;"
'Skip the header row
iRowNo = 2
'Loop until empty cell in CustomerId
Do Until .Cells(iRowNo, 1) = ""
sCustomerId = .Cells(iRowNo, 1)
sFirstName = .Cells(iRowNo, 2)
sLastName = .Cells(iRowNo, 3)
'Generate and execute sql statement to import the excel rows to SQL Server table
conn.Execute "insert into dbo.Customers (CustomerId, FirstName, LastName) values ('" & sCustomerId & "', '" & sFirstName & "', '" & sLastName & "')"
iRowNo = iRowNo + 1
Loop
MsgBox "Customers imported."
conn.Close
Set conn = Nothing
End With
End Sub
另外,看看这个 link。
https://www.excel-sql-server.com/excel-sql-server-import-export-using-vba.htm
如果循环方案对您来说太慢,请考虑将数据集保存为 CSV 文件并执行批量插入。
BULK
INSERT CSVTest
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
--Check the content of the table.
SELECT *
FROM CSVTest
GO
--Drop the table to clean up database.
DROP TABLE CSVTest
GO