以下代码在此存储过程上不起作用。它适用于查询和另一个存储过程。
它将不会找到此存储过程的值,并返回错误"Item be debug.print in the collection in the collection for the requested or ordinal“
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
发布于 2014-10-28 22:41:51
确保要访问数据库的用户的安全对象中包含存储过程。为此:
在SSMS的安全性下-->用户-->右键单击您正在访问的用户-->单击属性-->单击Securables选项卡,查看列表并确保其中包含存储过程。如果没有单击"search“按钮-->检查"specific objects”单选框-->单击OK -->在新弹出的窗口中单击"Object type“按钮--> check Stored procedure checkbox -->单击OK -->确保存储过程已列出并单击OK -->在securables下列出后立即单击OK -->在显式选项卡下查找权限列中的"Excute”-->找到Grantor列下有"dbo“的那个,然后选中Grant复选框并单击OK。
这应该可以解决问题。
发布于 2014-11-11 01:18:34
确保您的数据集未在筛选中。将数据集的筛选器设置为false,然后关闭它,然后使用它。或者最好使用干净的数据集。
发布于 2016-10-31 18:38:25
您的存储过程中有可能包含debug select吗?您可能正在选择某个变量的值作为调试语句。这将产生返回两个表的效果。除非另有说明,否则您的数据集将位于第一个数据集。
在SSMS中这样做,并确保它返回的是您认为它返回的内容。
exec SP_storedprocedure 0
另外,为了解决这个问题,可以创建4条debug.print语句,看看哪条语句会中断。
考虑到您对@MarkBalhoff关于列计数为零的声明,另一种可能是您只是忘记在查询结束时返回结果。您正在构建临时表吗?
sp中的最后一个(或接近最后一个)语句应该是
select * from #temp
类似于在函数中计算正确的值,然后忘记返回它。
https://stackoverflow.com/questions/24620324
复制相似问题