Ошибка привязки собственного параметра функции сервера sql

Я использую следующий программный стек в Ubuntu 10.04 Lucid LTS для подключения к базе данных:

  1. Python 2.6.5 (пакет Ubuntu)
  2. pyodbc git trunk коммит eb545758079a743b2e809e2e219c8848bc6256b2
  3. unixodbc 2.2.11 (пакет Ubuntu)
  4. freetds 0.82 (пакет Ubuntu)
  5. Windows с Microsoft SQL Server 2000 (8.0)

Я получаю эту ошибку при попытке выполнить привязку собственных параметров в аргументах к функции SQL SERVER:

Traceback (most recent call last):
 File "/home/nosklo/devel/testes/sqlfunc.py", line 32, in <module>
   cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))
pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL
Server]SqlDumpExceptionHandler: Process 54 generated fatal exception
c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this
process.\r\n (0) (SQLPrepare)')

Вот код воспроизведения:

import pyodbc
constring = 'server=myserver;uid=uid;pwd=pwd;database=db;TDS_Version=8.0;driver={FreeTDS}'

con = pyodbc.connect(constring)
print 'VERSION: ', con.getinfo(pyodbc.SQL_DBMS_VER)

cur = con.cursor()
try:
   cur.execute('DROP FUNCTION fn_FuncTest')
   con.commit()
   print "Function dropped"
except pyodbc.Error:
   pass

cur.execute('''
   CREATE FUNCTION fn_FuncTest (@testparam varchar(4))
   RETURNS @retTest TABLE (param varchar(4))
   AS
   BEGIN
       INSERT @retTest
       SELECT @testparam
       RETURN
   END''')
con.commit()

Теперь функция создана. Если я попытаюсь вызвать его, используя значение непосредственно в запросе (без собственных привязок значений), он отлично работает:

cur.execute("SELECT * FROM fn_FuncTest('test')")
assert cur.fetchone()[0] == 'test'

Однако я получаю сообщение об ошибке выше, когда пытаюсь выполнить нативную привязку (используя заполнитель параметра и передавая значение отдельно):

cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))

Дальнейшее расследование выявило некоторые странные вещи, о которых я хотел бы рассказать:

  • Все работает нормально, если я изменю версию TDS на 4.2 (однако отчет о версии с сервера sql неверен - используя версию TDS 4.2, я получаю '95.08.0255' вместо реальной версии '08.00.0760').
  • Все работает нормально для двух других типов функций -> функции, которые возвращают значение, и функции, которые являются просто запросом SELECT (например, представление), оба работают нормально. Вы даже можете определить новую функцию, которая возвращает результат запроса другой (неработающей) функции, и таким образом все будет работать, даже при выполнении встроенных привязок к параметрам. Например: CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
  • Соединение становится очень нестабильным после этой ошибки, вы не можете восстановить.
  • Ошибка возникает при попытке связать любой тип данных.

Как я могу продолжать это дальше? Я хотел бы сделать собственные привязки к параметрам функции.


person nosklo    schedule 29.06.2010    source источник
comment
Процесс 54 сгенерировал фатальное исключение c0000005 EXCEPTION_ACCESS_VIOLATION: вам лучше обратиться в службу поддержки продукта. По крайней мере, сообщите об этом на connect.microsoft.com/SQLServer, убедитесь, что вы прикрепили .mdmp файл(ы) из папки LOG сервера. Команда продукта может предложить обходной путь.   -  person Remus Rusanu    schedule 29.06.2010
comment
@Remus Rusanu: базовая поддержка SQL SERVER 2000 давно прекращена. Похоже, расширенная поддержка этого не покрывает. Я также не думаю, что Microsoft помогает при использовании драйвера odbc freetds.   -  person nosklo    schedule 29.06.2010


Ответы (1)


В конечном счете, это, вероятно, не тот ответ, который вы ищете, но когда мне пришлось подключаться к MSSQL из Perl два или три года назад, изначально был задействован ODBC + FreeTDS, и я ничего с ним не добился (хотя я не помню конкретных ошибок, хотя я пытался сделать привязку, и это казалось источником некоторых проблем).

В проекте Perl я в конечном итоге использовал драйвер, предназначенный для Sybase (от которого MSSQL является ответвлением), так что вы можете изучить его.

В вики Python есть страница о Sybase и другая о SQL Server, которую вы, вероятно, захотите просмотреть в поисках альтернатив:

http://wiki.python.org/moin/Sybase

http://wiki.python.org/moin/SQL%20Server

person Nicholas Knight    schedule 10.07.2010