我正在尝试使用bcp
命令将数据从Excel推送到SQL Server。目前我已经设置了我的代码,例如它创建了需要被推送的数据的文本文件(在循环中),然后运行下面提到的bcp
命令
bcp dbname.schema_name.table_name out C:\table_name.txt -n -S localhost -U username -P password -b 10000
但是我想取消循环并希望运行单个bcp
命令,其中多个表的名称作为第一个参数,不同的文本文件作为第二个参数。我尝试在网上找到这个解决方案,但无法想出任何东西。
非常感谢任何帮助。
只是一点背景:我想要取消循环并运行单个命令的原因是,我观察到我的代码的奇怪行为,当我单步执行我的代码时,它能够推送所有数据到SQL Server,但是当我通过单击分配了宏的按钮一次运行整个过程时,代码仍然运行但不会将任何数据推送到SQL Server。
为了解决这个问题,我尝试在bcp
命令之后添加doevents但是一切都是徒劳的,然后我在bcp命令之后设置了等待5秒,它似乎工作,但我觉得设置等待是有点危险的生意我永远不会确定等待时间应该是什么。
答案 0 :(得分:3)
单个BCP命令只能将数据推送到单个表。无法将多个表名传递给单个BCP命令。
答案 1 :(得分:0)
一个好的旧式循环来处理任务并没有错。
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
另外,请查看此链接。
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