php pdo fetchAll返回SQL错误';没有活动字段';当执行存储过程时


php pdo fetchAll returns SQL error 'no active fields' when executing stored procedure

我的存储过程从Management Studio执行100%fine,但当使用try-catch块运行PDO时,我会收到以下异常消息:SQLSTATE[IMSPSP]:查询的活动结果不包含字段。

我尝试过经典的SET NOCOUNT ON(这让我之前很头疼)来阻止它返回行计数,我还做了各种测试,删除了SP的部分,直到找到错误所在的部分。我还尝试过PHP PDO nextRowset(),但没有成功。

存储过程:我声明了一个游标(我知道,震惊,恐怖!)并迭代一些结果,这本身并没有造成任何问题——但实际上,这个游标必须为游标中的每个提取运行各种存储过程,当我引入这些存储过程时,问题就出现了。

我已经浏览了光标内的SP,并在它们上设置NOCOUNT ON,以防出现问题,但运气不好。其中一个或两个SP具有OUTPUTS,但这些OUTPUTS相应地被捕获在变量中。

有人有什么想法吗?我不想发布任何项目代码,但我在光标块中执行的一些命令场景:

SELECT @varName = columnName FROM dbo.tableName
SET @varName = (SELECT columnName FROM dbo.tableName)
EXEC dbo.storedProcedure @outputVar OUTPUT

我最好的猜测是上面的例子是问题所在,但我不知道。我希望在不逐个删除这些错误的情况下定位错误,因为整个过程执行的操作很难在我的测试数据库上回滚,并且每一行对于获得正确的输出都很重要。

提前感谢您提供的任何帮助!

我现在已经设法解决了这个问题!希望该解决方案能帮助其他遇到此错误或类似错误的人。

问题是嵌套游标(游标内部的游标)正在用于SQL Server存储过程。我的主过程(由PDO从PHP调用)打开了一个游标,然后在该游标内运行其他存储过程,这些存储过程打开了自己的游标。

当在SQLServerManagementStudio中运行查询时,此方法运行良好,但通过PDO从PHP调用失败。

虽然我知道大多数SQL爱好者认为使用游标是不好的做法,但不幸的是,我继承了这些存储过程,所以我要把所有的责任都推卸给自己!

实际的解决方案是用while循环替换原始存储过程中的光标(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

问题解决了,找到噩梦!