php pdo fetchAll возвращает ошибку SQL «нет активных полей» при выполнении хранимой процедуры

0

Моя хранимая процедура выполняет 100% -ный штраф из Studio Management, но при запуске PDO с блоком catch try я получаю следующее сообщение об исключении: SQLSTATE [IMSSP]: активный результат для запроса не содержит полей.

Я попробовал классический SET NOCOUNT ON (это раньше меня поймало), чтобы остановить его подсчет строк, и я провел различные тесты, удалив разделы SP, пока не нашел, в каком разделе находится ошибка. попробовал PHP PDO nextRowset() без везения.

Хранимая процедура: объявляю курсор (удар, ужас, который я знаю!) И повторяю некоторые результаты, которые сами по себе не вызвали проблем, - но на самом деле этот курсор должен запускать различные хранимые процедуры для каждой выборки в курсоре, а когда я ввожу эти хранимые процедуры, когда возникают проблемы.

Я прошел через SP внутри курсора и SET NOCOUNT ON на них, если это может быть проблемой, но не повезло. У одного или двух из этих SP есть OUTPUTS, но они фиксируются в переменных соответственно.

У кого-нибудь есть идеи? Я не хочу публиковать какой-либо код проекта, но некоторые сценарии команд, которые я выполняю в блоке курсора:

SELECT @varName = columnName FROM dbo.tableName

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

EXEC dbo.storedProcedure @outputVar OUTPUT

Моя лучшая догадка - главный пример проблемы, но я не знаю, что знаю. Я хотел бы найти ошибку, не удаляя их по одному, так как действия, выполняемые в целом по процедуре, трудно откатить в моей тестовой базе данных, и каждая строка важна для получения правильного вывода.

Заранее благодарим за предоставленную помощь!

Теги:
sql-server
stored-procedures
pdo

1 ответ

1
Лучший ответ

Теперь мне удалось это решить! Надеемся, что решение поможет другим, столкнувшимся с этой ошибкой или схожим.

Проблема заключалась в том, что в хранимой процедуре SQL Server использовались вложенные курсоры (курсор внутри курсора). Моя основная процедура (вызванная PHP от PDO) открыла курсор, а затем запустила другие хранимые процедуры внутри этого курсора, которые открыли собственный курсор.

Этот метод отлично работает при запуске запроса в SQL Server Management Studio, но вызов из PHP через PDO завершается с ошибкой.

Хотя я знаю, что использование курсоров считается плохой практикой большинством баффов 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

Проблема решена, кошмар, чтобы найти!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню