我的存储过程从Management Studio执行100%罚款,但是当使用try catch块运行PDO时,我收到以下异常消息: SQLSTATE [IMSSP]:查询的活动结果不包含任何字段。
我尝试过经典的SET NOCOUNT ON(这让我以前抓住了)来阻止它返回行计数,我已经通过删除SP的各个部分进行了各种测试,直到我找到了错误所在的部分.I还试过PHP PDO nextRowset()没有运气。
存储过程: 我声明了一个游标(震惊,恐怖,我知道!)并迭代一些结果,这本身没有引起任何问题 - 但实际上这个游标必须为游标中的每次提取运行各种存储过程本身,当我引入这些存储过程时是问题出现的时候。
我已经浏览了游标中的SP并在它们上面设置了NOCOUNT ON,以防可能出现问题,但没有运气。这些SP中的一个或两个具有输出,但相应地在变量中捕获这些输出。
有没有人有任何想法?我不希望发布项目的任何代码,但是我在光标块中执行了一些命令:
SELECT @varName = columnName FROM dbo.tableName
SET @varName = (SELECT columnName FROM dbo.tableName)
EXEC dbo.storedProcedure @outputVar OUTPUT
我最好的猜测是问题的最好的例子,但我不知道知道。我想找到错误而不是逐个删除这些错误,因为整个过程执行的操作很难在我的测试数据库上回滚,并且每一行对于获得正确的输出都很重要。
提前感谢您提供的任何帮助!
答案 0 :(得分:1)
我现在设法解决了这个问题!希望该解决方案能够帮助遇到此错误或类似错误的其他人。
问题是嵌套游标(游标内的游标)正在用于SQL Server存储过程。我的主程序(由PDO从PHP调用)打开一个游标,然后在游标中运行其他存储过程,打开了自己的游标。
此方法在SQL Server Management Studio中运行查询时工作正常,但通过PDO从PHP调用失败。
虽然我知道使用游标被大多数SQL buff视为不好的做法,但遗憾的是我继承了这些存储过程,所以我要从自己身上删除所有责任!
实际的解决方案是使用如下代码替换原始存储过程中的游标(由PHP调用,然后调用其他SP的游标):
DECLARE @loopTable table (id int IDENTITY(1,1), dataColumn)
DECLARE @id int
DECLARE @rows int
DECLARE @data int -- var to hold targeted data in the loop
INSERT INTO @loopTable (dataColumn)
SELECT dataColumn FROM dataTable
SELECT @rows = COUNT(1) FROM @loopTable
WHILE (@rows > 0)
BEGIN
SELECT TOP 1 @data = dataColumn, @id = id FROM @loopTable
// Do stuff with @data variable here
DELETE FROM @loopTable where id = @id
SELECT @rows = COUNT(1) from @loopTable
END
问题解决了,找到了噩梦!