以下代码不适用于此存储过程。它适用于查询和另一个存储过程。
它不会debug.print这个存储过程的值,并返回错误“无法在对应于所请求的名称或序号的集合中找到项目”
Dim x As ADODB.Connection
Set x = New ADODB.Connection
x.ConnectionString = "Provider=a;Server=b;Database=c;Trusted_Connection=yes;"
x.Open
Dim y As ADODB.Recordset
Set y = New ADODB.Recordset
x.CommandTimeout = 0
Set y = x.Execute("exec SP_storedprocedure 0")
Debug.Print y(0), y(1), y(2), y(3)**--the problem is here**
y.Close
Set y = Nothing
x.Close
Set x = Nothing
答案 0 :(得分:0)
确保存储过程包含在您正在访问数据库的用户的securables中。为此:
在安全的SSMS上 - >在用户下 - >右键单击您正在访问的用户 - >点击属性 - >单击Securables选项卡并查看列表并确保其中包含存储过程。如果没有,请点击"搜索"按钮 - >检查"特定对象"收音机 - >单击确定 - >点击"对象类型"新弹出窗口上的按钮 - >选中存储过程复选框 - >单击确定 - >确保列出了存储过程,然后单击“确定” - >现在它在securables下列出 - >在显式标签下查找" Excute"在权限列 - >找到一个有" dbo"在Grantor Column下,选中Grant复选框,然后单击OK。
这应该可以解决问题。
答案 1 :(得分:0)
确保您的数据集未被过滤。将数据集的过滤器设置为false然后关闭它,然后使用它。或者更好地使用干净的数据集。
答案 2 :(得分:0)
您的存储过程是否可以在其中进行调试选择?可能您正在选择某个变量的值作为调试语句。这会产生返回两个表的效果。除非另有说明,否则您的数据集将在第一个数据集中。
在SSMS中执行此操作并确保它返回您认为返回的内容。
exec SP_storedprocedure 0
另外,要解决问题,请制作4个debug.print语句并查看哪个(哪些)中断。
考虑到您对@MarkBalhoff关于列数为零的定义,另一种可能性是您只是忘记在查询结束时返回结果。你在建一个温度表吗?
你sp中的最后一个(或接近最后一个)语句应该是
select * from #temp
类似于计算函数中的正确值,然后忘记返回它。