2014-11-05 55 views
0

我的存儲過程從Management Studio執行100%正常,但是當通過帶有try catch塊的PDO運行時,我收到以下異常消息: SQLSTATE [ IMSSP]:查詢的活動結果不包含任何字段。php pdo fetchAll在執行存儲過程時返回SQL錯誤'no active fields'

我已經試過了經典的SET NOCOUNT ON(這讓我知道以前)阻止它返回行數,並且我通過刪除SP的各個部分來完成各種測試,直到找到錯誤所在的部分。我也嘗試過PHP PDO nextRowset(),但沒有運氣。我聲明瞭一個遊標(shock,恐怖我知道!)並迭代了一些結果,這本身並沒有引起任何問題 - 但實際上這個遊標必須爲遊標中的每次獲取運行各種存儲過程本身,當我介紹這些問題出現時的存儲過程。

我已經通過光標內的SP和SET NOCOUNT ON在他們的情況下可能是問題,但沒有運氣。這些SP中的一個或兩個具有輸出,但是這些被相應地記錄在變量中。

有沒有人有任何想法?我不希望我後執行該項目的任何代碼,但命令的一些場景光標塊:

SELECT @varName = columnName FROM dbo.tableName 

SET @varName = (SELECT columnName FROM dbo.tableName) 

EXEC dbo.storedProcedure @outputVar OUTPUT 

我最好的猜測是頂級的例子是問題,但我不懂行的就知道了。我希望找到錯誤,而不是一個接一個地刪除這些錯誤,因爲整個過程所執行的操作難以回滾到我的測試數據庫,並且每一行對於獲取正確的輸出都很重要。

在此先感謝您提供的任何幫助!

回答

1

我現在已經設法解決了這個問題!希望這個解決方案能夠幫助那些遇到這個錯誤或類似問題的人。

問題是嵌套的遊標(遊標內的遊標)正在用於SQL Server存儲過程。我的主要過程(由PDO從PHP調用)打開一個遊標,然後在該遊標內運行其他存儲過程,以打開它們自己的遊標。

此方法在SQL Server Management Studio中運行查詢時正常工作,但通過PDO從PHP調用失敗。

雖然我知道使用遊標被大多數SQL愛好者認爲是不好的做法,但不幸的是,我繼承了這些存儲過程,因此我將自己的所有責任徹底清除!

的實際解決方案是替代在發起存儲過程中的光標(該一個由PHP稱爲後者又調用其他的SP),使用這樣的代碼while循環:

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 

問題解決了,噩夢找到!