Sql server 如何将数据从Excel发送到SQL临时表,以便使用VBA进行处理?

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

我的小组使用一个基于Excel宏的工具来进行一些认真的数字运算。我想将数字处理部分移到SQL,因为由于运行时间的原因,使用VBA已经变得不可忍受了。用户需要能够使用Excel作为界面,还需要能够同时运行宏,因为Excel工作簿是自包含的。我一直在测试我的计划,从VBA调用SQL存储过程,将Excel中的数据拉入SQL临时表,对其进行处理,然后将其发送回Excel。如果我在SQL Management Studio中运行SP,我就能够从Excel中提取数据。以下是SP:

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,而不是先将其加载到数据库中?