Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-存储过程(SQL Server)_Sql_Sql Server_Excel_Vba_Excel 2010 - Fatal编程技术网

Excel VBA-存储过程(SQL Server)

Excel VBA-存储过程(SQL Server),sql,sql-server,excel,vba,excel-2010,Sql,Sql Server,Excel,Vba,Excel 2010,我在检索多个记录集(具有列名)和将数据粘贴到Excel工作表中时遇到了一个小问题,如下图所示 我刚才使用的VBA代码检索第一个记录集,但不检索其余的记录集 非常感谢您的帮助,谢谢 子流程() Dim Conn作为ADODB.Connection,记录集作为ADODB.RecordSet Dim命令作为ADODB.Command Dim ConnectionString作为字符串,StoredProcName作为字符串 尺寸范围1作为ADODB.Parameter,范围2作为ADODB.Para

我在检索多个记录集(具有列名)和将数据粘贴到Excel工作表中时遇到了一个小问题,如下图所示

我刚才使用的VBA代码检索第一个记录集,但不检索其余的记录集

非常感谢您的帮助,谢谢

子流程()
Dim Conn作为ADODB.Connection,记录集作为ADODB.RecordSet
Dim命令作为ADODB.Command
Dim ConnectionString作为字符串,StoredProcName作为字符串
尺寸范围1作为ADODB.Parameter,范围2作为ADODB.Parameter
将SP_参数1设置为字符串
将SP_参数2设置为字符串
Application.ScreenUpdating=False
Set Conn=新的ADODB.连接
Set RecordSet=New ADODB.RecordSet
Set Command=New ADODB.Command
ServerName=“1111”
DatabaseName=“dataReporting”
UserId=“88888”
密码=“88888”
SP_Param1=“开始日期”
SP_Param2=“结束日期”
StoredProcName=“KPI\U报告”
ConnectionString=“PROVIDER=SQLOLEDB;数据源=“&ServerName&_
“初始目录=“&DatabaseName&”用户Id=“&”_
UserId&“Password=”&Password&“;”
连接开放连接字符串
指挥
.ActiveConnection=Conn
.CommandType=adCmdStoredProc
.CommandText=StoredProcName
.CommandTimeout=0
以
Set range1=Command.CreateParameter(SP_Param1,adDBDate,adParamInput,DateSerial(2018,1,1))
Command.Parameters.Append range1
Set range2=Command.CreateParameter(SP_Param2,adDBDate,adParamInput,DateSerial(2018,4,1))
Command.Parameters.Append range2
Set RecordSet=Command.Execute
表(“表1”)。范围(“A2”)。复制自记录集记录集
记录集,关闭
康涅狄格州关闭
错误转到0
Application.ScreenUpdating=True
出口接头
端接头
更新

我添加了下面的循环,但仍然没有运气

“循环记录集和放置值
RecordSet.MoveFirst
当RecordSet.EOF=False时执行
对于RecordSet.Fields.Count-1,i=0
ActiveCell.Value=记录集.Fields(i).Value
ActiveCell.Offset(0,1).激活
接下来我
ActiveCell.Offset(1,-i).激活
RecordSet.MoveNext
环
这是存储过程代码:

Sub-storedproc()
Dim Conn作为ADODB连接
将ADODBCmd设置为ADODB.Command
将rs设置为ADODB.RecordSet
作为整数的Dim i
暗连接为字符串
ServerName=“1111”
DatabaseName=“dataReporting”
UserId=“88888”
密码=“88888”
SP_Param1=“开始日期”
SP_Param2=“结束日期”
StoredProcName=“KPI\U报告”
sConnect=“PROVIDER=SQLOLEDB;数据源=“&ServerName&
“初始目录=“&DatabaseName&”用户Id=“&UserId&”
“Password=“&Password&;”
"建立联系",
Set Conn=新的ADODB.连接
Conn.ConnectionString=sConnect
康涅狄格州公开赛
'打开记录集
Set ADODBCmd=New ADODB.Command
ADODBCmd.ActiveConnection=Conn
ADODBCmd.CommandText=StoredProcName
ADODBCmd.CommandType=adCmdStoredProc
ADODBCmd.CommandTimeout=0
Set range1=ADODBCmd.CreateParameter(SP_Param1,adDBDate,adParamInput,DateSerial(2018,1,1))
ADODBCmd.Parameters.Append range1
Set range2=ADODBCmd.CreateParameter(SP_Param2,adDBDate,adParamInput,DateSerial(2018,4,1))
ADODBCmd.Parameters.Append range2
Set rs=ADODBCmd.Execute()
'循环记录集并放置值
先走一步
当rs.EOF=False时执行
对于i=0到rs.Fields.Count-1
ActiveCell.Value=rs.Fields(i).Value
ActiveCell.Offset(0,1).激活
接下来我
ActiveCell.Offset(1,-i).激活
下一个
环
“清理
rs.Close
设置rs=无
端接头

因此存储过程需要返回多个记录集,例如

CREATE PROCEDURE GetCarsAndCategories
AS
BEGIN
SELECT * FROM Cars
SELECT * FROM Categories
END
然后,VBA代码最初可以访问Cars记录集,并访问类别记录集。我们调用S Meaden提到的
GetNextRecordSet

解决了由于存储过程而产生多个记录集的问题。
下面的代码将所有记录集(包括字段名)转储到一个工作表中(如果重复运行工作表,请不要忘记首先清理该工作表)


您需要调用以返回多个结果集,将过程代码添加到问题中。再次,将过程代码添加到问题中(如果需要,请进行模糊处理)。程序和应用程序代码相互协调,我想确保我们拥有帮助您所需的所有信息。我很乐意提供帮助。还在等待过程代码。@Elixir,我想你会发现他指的是存储过程KPI_报告的代码
...
Set rs = Command.Execute
Dim startcol As Long
startcol = 1
With ThisWorkbook.Sheets(1)
    Do While Not rs Is Nothing

        Dim col As Long
        For col = 0 To rs.Fields.Count - 1
            .Cells(1, startcol + col) = rs.Fields(col).Name
        Next col
        .Cells(2, startcol).CopyFromRecordset rs

        startcol = startcol + rs.Fields.Count + 1
        Set rs = rs.NextRecordset
    Loop
End With