Ich bin in eine Datenbank des folgenden Software-Stack auf Ubuntu 10.04 Lucid LTS zu anschließen:SQL-Server-Funktion nativen Parameter binden Fehler
- Python 2.6.5 (ubuntu-Paket)
- Pyodbc git Stamm begehen
eb545758079a743b2e809e2e219c8848bc6256b2
- unixodbc 2.2.11 (ubuntu-Paket)
- freetds 0,82 (ubuntu-Paket)
- Fenster mit Microsoft SQL Server 2000 (8.0)
Ich bekomme diese Fehlermeldung, wenn nativer Parameter zu tun versucht, bindet in Argumente zu einer SQL Server-Funktion:
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)')
Hier ist die Wiedergabe Code:
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()
Nun wird die Funktion erstellt wird. Wenn ich versuche, es zu nennen einen Wert direkt in der Abfrage (keine nativen bindet der Werte), es funktioniert:
cur.execute("SELECT * FROM fn_FuncTest('test')")
assert cur.fetchone()[0] == 'test'
Jedoch habe ich den Fehler oben, wenn ich versuche, eine native binden zu tun (durch einen Parameter verwenden Platzhalter und den Wert separat vorbei):
cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))
Weitere Untersuchungen haben einige seltsam Sachen enthüllt ich erzählen möchte:
- Alles funktioniert gut, wenn ich cha nge TDS Version 4.2 (jedoch Version Bericht von SQL Server ist falsch - mit TDS Version
4.2
bekomme ich'95.08.0255'
anstelle der realen Version'08.00.0760'
). - Alles funktioniert gut für die anderen beiden Arten von Funktionen -> Funktionen, die einen Wert zurückgeben und Funktionen, die nur eine SELECT Abfrage (wie eine Ansicht) funktionieren gut. Sie können sogar eine neue Funktion definieren, die das Ergebnis einer Abfrage für die andere (defekte) Funktion zurückgibt, und so funktioniert alles, , auch wenn native bindet auf die Parameter. Zum Beispiel:
CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
- Verbindung wird nach diesem Fehler sehr instabil, Sie können nicht wiederherstellen.
- Der Fehler tritt auf, wenn versucht wird, eine beliebige Art von Daten zu binden.
Wie kann ich das weiter verfolgen? Ich möchte native Bindungen zu Funktionsparametern machen.
Prozess 54 schwerwiegende Ausnahme C0000005 EXCEPTION_ACCESS_VIOLATION erzeugt: Sie besserer Produkt-Support. Melden Sie dies zumindest auf https://connect.microsoft.com/SQLServer, und stellen Sie sicher, dass Sie die .mdmp-Datei (en) aus dem Ordner LOG des Servers anhängen. Das Produktteam kann mit einer Problemumgehung antworten. –
Oh, verpasste ich SQL 2k –
@Remus Rusanu: Basis-Unterstützung für SQL Server 2000 ist vor langer Zeit beendet. Es scheint, dass erweiterte Unterstützung dies nicht abdecken wird. Ich denke auch nicht, dass Microsoft hilft, wenn Freedds ODBC-Treiber verwendet. – nosklo