我的存储过程从Management执行100%很好,但是当使用try catch块运行PDO时,我得到以下异常消息: SQLSTATEIMSSP:查询的活动结果不包含任何字段。
我已经尝试了经典的sections (这让我在前面就知道了)来停止它返回行计数,并且我已经通过删除SP的部分完成了各种测试,直到我找到了错误在哪个部分。我也尝试过PHP (),但没有成功。
存储过程:我声明一个游标(震惊,恐怖,我知道!)然后迭代一些结果,这本身不会导致任何问题--但实际上,这个游标必须为游标中的每个提取运行各种存储过程本身,当我介绍这些存储过程时,也就是问题出现的时候。
我已经通过了SPs内的光标,并设置了NOCOUNT对他们,以防这可能是问题,但没有运气。其中一个或两个SPs具有输出,但它们相应地在变量中捕获。
有人有什么想法吗?我不希望发布该项目的任何代码,但在游标块中执行的一些命令场景如下:
SELECT @varName = columnName FROM dbo.tableName
SET @varName = (SELECT columnName FROM dbo.tableName)
EXEC dbo.storedProcedure @outputVar OUTPUT我最好的猜测是最好的例子是问题,但我不知道知道。我想定位错误而不逐个删除这些错误,因为整个过程执行的操作很难回滚到我的测试数据库中,而且每一行对于获得正确的输出都很重要。
谢谢您提供的任何帮助!
发布于 2014-11-11 12:02:39
我现在已经解决了这个问题!希望该解决方案将帮助其他遇到此错误或类似问题的人。
问题是,SQL Server存储过程中使用了嵌套游标(游标中的游标)。我的主要过程(由PDO从PHP调用)打开一个游标,然后在该游标内运行其他存储过程,从而打开自己的游标。
在中运行查询时,此方法工作良好,但通过PDO从PHP调用失败。
虽然我知道大多数SQL迷认为使用游标是不好的做法,但不幸的是,我继承了这些存储过程,所以我要从自己身上消除所有的指责!
实际的解决方案是使用以下代码将原始存储过程( PHP调用的游标替换为调用其他SPs的存储过程)中的游标替换为with循环:
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问题解决了,噩梦来找!
https://stackoverflow.com/questions/26763777
复制相似问题