Я использую следующий программный стек на Ubuntu 10.04 Lucid LTS для подключения к базе данных:функция SQL Server ошибка родной параметр привязки
- питон 2.6.5 (Ubuntu пакет)
- pyodbc магистральный мерзавец совершить
eb545758079a743b2e809e2e219c8848bc6256b2
- UnixODBC 2.2.11 (Ubuntu пакет)
- FreeTDS 0,82 (убунту пакет)
- для 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',))
Дальнейшее исследование показывает некоторые странно материал, который я хотел бы отнести:
- Все отлично работает, если я тя nge 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))
- После этой ошибки соединение становится очень неустойчивым, вы не можете восстановить его.
- Ошибка при попытке привязки любого типа данных.
Как я могу продолжить это? Я хотел бы сделать собственные привязки к параметрам функции.
процесса 54 сгенерированного роковую исключение c0000005 EXCEPTION_ACCESS_VIOLATION: Вы лучше поддерживать контактную информацию. По крайней мере сообщите об этом на https://connect.microsoft.com/SQLServer, убедитесь, что вы прикрепляете файлы .mdmp из папки журнала сервера. Команда продукта может ответить обходным путем. –
О, я пропустил SQL 2k –
@Remus Rusanu: Базовая поддержка SQL SERVER 2000 закончилась давно. Похоже, что расширенная поддержка не будет охватывать это. Я также не думаю, что Microsoft помогает при использовании freetds odbc-драйвера. – nosklo