Ошибка хранимой процедуры Python 3 и pypyodbc

В настоящее время я использую Python 3.4.2 и pypyodbc 1.3.6.

Я пытаюсь запустить хранимую процедуру на сервере SQL. Когда я запускаю хранимую процедуру без необходимого параметра (даты), я получаю сообщение об ошибке о том, что параметр необходим (это ожидалось).

Когда я добавляю эту дату, я получаю сообщение об ошибке:

Недопустимое состояние курсора.

Я проверил, что дата находится в правильном формате (YYYY-MM-DD), и я пробовал это несколькими способами, но каждый раз получаю одну и ту же ошибку.

Ниже приведен код, который я использую:

import pypyodbc as odbc

connection_string = "DRIVER={SQL SERVER};SERVER=SERVERNAME;DATABASE=DATABASE;Trusted_Connection=yes"
conn = odbc.connect(connection_string)
cur = conn.cursor()
cur.execute("exec stored_procedure '2017-05-01'")
report_temp = cur.fetchall()

Получена ошибка:

line 975, in ctrl_err raise ProgrammingError(state,err_text)
pypyodbc.ProgrammingError: ('24000', '[24000] [Microsoft][ODBC SQL Server Driver]Invalid cursor state')

Любая помощь приветствуется.


person eternal_student    schedule 02.06.2017    source источник


Ответы (2)


Убедитесь, что хранимая процедура не выводит число строк или другие сообщения перед результирующим набором. Это может сбить с толку драйверы Python. EG эта процедура не работает с этой ошибкой для этого кода

create or alter procedure stored_procedure @date datetime
as
begin
  --set nocount on
  select * into #t from sys.objects
  select * from #t
end

Но раскомментирование «set nocount on» позволяет ему добиться успеха.

create or alter procedure stored_procedure @date datetime
as
begin
  set nocount on
  select * into #t from sys.objects
  select * from #t
end
person David Browne - Microsoft    schedule 02.06.2017

Я бы НАСТОЯТЕЛЬНО рекомендовал вам использовать замену параметра в подобном запросе, а также использовать функцию CALL для вызова хранимой процедуры. Попробуйте такой код:

cur.execute('{CALL stored_procedure(?)}', ('2017-05-01',))

Существует ряд причин, по которым это может завершиться ошибкой 24000. Наиболее распространенным (как упоминает Дэвид Браун выше) является отсутствие использования оператора SET NOCOUNT ON в вашей хранимой процедуре, но все, что возвращает несколько наборов результатов, также будет генерировать эту ошибку.

Есть и другие факторы, которые могут вызвать эту ошибку, например элемент данных слишком большого размера в возвращаемых значениях (например, текстовый блок размером 1 МБ, если вы настроены на возврат текста размером не более 8 КБ). Если исправление NOCOUNT не работает, возможно, нам потребуется просмотреть и вашу хранимую процедуру.

person Laughing Vergil    schedule 02.06.2017