Sql server 如何将数据从Excel发送到SQL临时表,以便使用VBA进行处理?
我的小组使用一个基于Excel宏的工具来进行一些认真的数字运算。我想将数字处理部分移到SQL,因为由于运行时间的原因,使用VBA已经变得不可忍受了。用户需要能够使用Excel作为界面,还需要能够同时运行宏,因为Excel工作簿是自包含的。我一直在测试我的计划,从VBA调用SQL存储过程,将Excel中的数据拉入SQL临时表,对其进行处理,然后将其发送回Excel。如果我在SQL Management Studio中运行SP,我就能够从Excel中提取数据。以下是SP:Sql server 如何将数据从Excel发送到SQL临时表,以便使用VBA进行处理?,sql-server,vba,excel,Sql Server,Vba,Excel,我的小组使用一个基于Excel宏的工具来进行一些认真的数字运算。我想将数字处理部分移到SQL,因为由于运行时间的原因,使用VBA已经变得不可忍受了。用户需要能够使用Excel作为界面,还需要能够同时运行宏,因为Excel工作簿是自包含的。我一直在测试我的计划,从VBA调用SQL存储过程,将Excel中的数据拉入SQL临时表,对其进行处理,然后将其发送回Excel。如果我在SQL Management Studio中运行SP,我就能够从Excel中提取数据。以下是SP: ALTER PROCEDU
ALTER PROCEDURE sp_test_import
-- Add the parameters for the stored procedure here
@path varchar(1000)
AS
BEGIN
SET NOCOUNT ON;
declare @SQL varchar(2500);
set @SQL = '
select *
from openrowset(''Microsoft.ACE.OLEDB.12.0'',
''Excel 12.0 Macro;
Database='+@path+''',
[Sheet1$]); '
create table [#test](
col1 varchar(15),
col2 varchar(15),
col3 varchar(15),
col4 varchar(15)
)
insert into #test
exec(@SQL)
select * from #mb_test
END
这样就行了。然后,我尝试从包含数据的Excel文件调用此SP
Option Explicit
Sub ado_test()
Dim adoConnection As ADODB.Connection
Dim adoRecordset As ADODB.Recordset
Dim connectString As String
Dim strSQL As String
Dim sPath As String
Worksheets("Sheet1").Select
sPath = ThisWorkbook.FullName
'-Create a new ADO connection --
Set adoConnection = New ADODB.Connection
'-Create a new ADO recordset --
Set adoRecordset = New ADODB.Recordset
'-Build our connection string to use when we open the connection --
connectString = "DRIVER=SQL Server;SERVER=MyServer;Trusted_Connection=yes;DATABASE=testDB"
adoConnection.ConnectionTimeout = 20
adoConnection.CommandTimeout = 20
adoConnection.Open connectString
strSQL = "EXEC testDB.dbo.sp_test_import " & vbCr _
& "@path = " & "'" & sPath & "'"
adoRecordset.Open strSQL, adoConnection
End Sub
代码挂起在“adoRecordset.Open”调用上。如果我在变量@path中传递一个单独Excel文件的路径,那么一切都会顺利进行。是否有一种简单的方法可以从同一工作簿调用SP?我不担心安全性,因为SQL db将是一个用于拉入和处理临时数据的专用结构。我只需要用户能够随时运行他们的Excel工具,所以我不想在DB中使用永久表,以防他们各自的输入混淆在一起
我在网上找到的所有东西都与ASP或ISS有关,而我对ASP和ISS一无所知,这似乎不是解决我特定问题的正确方法。我可以让VBA将数据传递到外部文本文件,然后将这些文本文件的路径传递到SQL SP,但如果有更干净的解决方案,我想了解一下。提前谢谢 我认为这是因为您传入了
strSQL
,一个字符串
数据类型,作为.Open
方法的第一个参数,但是Open
方法需要命令
对象(根据)
您要做的是声明一个ADODB.Command
对象并传递它。我已修改您的代码以执行此操作:
Option Explicit
Sub ado_test()
Dim adoConnection As ADODB.Connection
Dim adoRecordset As ADODB.Recordset
Dim adoCommand As ADODB.Command
Dim connectString As String
Dim strSQL As String
Dim sPath As String
Worksheets("Sheet1").Select
sPath = ThisWorkbook.FullName
'-Create a new ADO connection --'
Set adoConnection = New ADODB.Connection
'-Create a new ADO recordset --'
Set adoRecordset = New ADODB.Recordset
'-Create a new ADO command --'
Set adoCommand = New ADODB.Command
'-Build our connection string to use when we open the connection --'
connectString = "DRIVER=SQL Server;SERVER=MyServer;Trusted_Connection=yes;DATABASE=testDB"
adoConnection.ConnectionTimeout = 20
adoConnection.CommandTimeout = 20
adoConnection.Open connectString
strSQL = "sp_test_import"
With adoCommand
.ActiveConnection = adoConnection
.CommandText = strSQL
.CommandType = adCmdStoredProc
.Parameters.Refresh
.Parameters(1).Value = sPath
End With
Set adoRecordset = adoCommand.Execute
If adoRecordset.EOF = False Then ThisWorkbook.Worksheets("YourSheetName").Cells(1, 1).CopyFromRecordset adoRecordset
'--adoRecordset.Open adoCommand, adoConnection'
'--Close the database connection'
adoConnection.Close
End Sub
有关该对象的详细信息
我还添加了如何使用
CopyFromRecordset
从SQL Server获取值到Excel工作簿谢谢你,Joshua。我已经测试了您的代码,并得到以下错误:“无法更改具有命令对象的记录集对象的activeconnection属性”。。。有什么想法我可能会错过?哦,对不起,我会更新。我完全不知道你在做一个存储过程。我更新了我的答案,我将尝试用我自己的数据库快速测试,以确保它按我的设想运行。我还添加了如何使用CopyFromRecordset
方法将记录集中的值提取到工作簿中。请告诉我,如果这对您有效,它仍然会超时,并出现错误“[Microsoft][ODBC SQL Server Driver]查询超时已过期”。如果它对你有用的话,可能和我的系统有关。一切都在服务器本身(excel文件,db)上,所以我不认为这会是防火墙问题,但可能是我的SQL server配置中的某个问题?还要感谢有关命令对象和CopyFromRecordset方法的信息!有什么理由不只是使用ADO在excel工作簿上运行SQL,而不是先将其加载到数据库中?