Używam następujący zestaw oprogramowania na Ubuntu 10.04 LTS Lucid do połączyć się z bazą danych:sql server error natywna funkcja parametr wiążą
- Python 2.6.5 (pakiet ubuntu)
- pyodbc git bagażnika popełnić
eb545758079a743b2e809e2e219c8848bc6256b2
- unixodbc 2.2.11 (pakiet ubuntu)
- freetds 0,82 (pakiet ubuntu)
- systemu Windows z Microsoft SQL Server 2000 (8,0)
otrzymuję ten błąd, gdy próbuje zrobić natywną parametr wiąże w argumentach do funkcji 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)')
Oto kod reprodukcji:
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()
Teraz funkcja jest tworzony. Gdy próbuję to nazwać używając wartości bezpośrednio w zapytaniu (brak rodzimych wiąże się z wartościami), to działa dobrze:
cur.execute("SELECT * FROM fn_FuncTest('test')")
assert cur.fetchone()[0] == 'test'
Jednakże pojawia się błąd powyżej, gdy próbuję zrobić natywną bind (za pomocą parametru zastępczy i przechodzącej wartość oddzielnie):
cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))
Dalsze dochodzenie ujawnia niektóre dziwne rzeczy chciałbym odnosić się:
- Wszystko działa poprawnie, jeśli cha nge TDS w wersji 4.2 (jednak raport o wersji z serwera sql jest nieprawidłowy - przy użyciu wersji TDS
4.2
Otrzymuję'95.08.0255'
zamiast prawdziwej wersji'08.00.0760'
). - Wszystko działa poprawnie dla pozostałych dwóch typów funkcji -> funkcje, które zwracają wartość i funkcje, które są tylko SELECT zapytanie (jak widok), oba działają dobrze. Można nawet zdefiniować nową funkcję , która zwraca wynik zapytania z drugiej (zepsutej) funkcji, i w ten sposób wszystko zadziała, , nawet jeśli wykonuje natywne wiązania na parametrach. Na przykład:
CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
- Połączenie staje się bardzo niestabilne po tym błędzie, nie można odzyskać.
- Błąd występuje podczas próby powiązania dowolnego typu danych.
Jak mogę kontynuować to dalej? Chciałbym wykonać macierzyste powiązania z parametrami funkcji.
Proces 54 wygenerowany wyjątek krytyczny c0000005 EXCEPTION_ACCESS_VIOLATION: Ty lepiej skontaktować się z obsługą produktu. Najpierw zgłoś to na https://connect.microsoft.com/SQLServer, upewnij się, że załączasz plik .mdmp z folderu LOG serwera. Zespół produktu może odpowiedzieć na to obejście. –
Och, brakowało mi SQL 2k –
@Remus Rusanu: Podstawowa obsługa SQL SERVER 2000 zakończyła się dawno temu. Wydaje się, że rozszerzona pomoc nie obejmie tego problemu. Też nie myślę, że Microsoft pomaga podczas korzystania z sterownika odbc freetds. – nosklo