estoy usando la siguiente pila de software en Ubuntu 10.04 LTS Lucid a conectarse a una base de datos:función de servidor SQL error de parámetro nativo se unen
- Python 2.6.5 (paquete de ubuntu)
- pyodbc git tronco comprometerse
eb545758079a743b2e809e2e219c8848bc6256b2
- unixodbc 2.2.11 (paquete de ubuntu)
- freetds 0,82 (paquete de ubuntu)
- de Windows con Microsoft SQL Server 2000 (8,0)
me sale este error al intentar hacer parámetro nativa se une en argumentos a una función de servidor SQL:
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)')
Aquí está el código de la reproducción: se crea
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()
Ahora la función. Si trato de llamar usando un valor directo en la consulta (no se une autóctonos de valores) que trabaja muy bien:
cur.execute("SELECT * FROM fn_FuncTest('test')")
assert cur.fetchone()[0] == 'test'
Sin embargo me sale el error anterior cuando intento hacer un aprieto nativa (mediante el uso de un parámetro marcador de posición y pasando el valor por separado):
cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',))
la posterior investigación revela alguna extraña cosas que me gustaría relacionarse:
- Todo funciona bien si cha nge TDS Version to 4.2 (sin embargo, informe de versión del servidor sql es incorrecto - usando la versión
4.2
de TDS Obtengo'95.08.0255'
en lugar de la versión real'08.00.0760'
). - Todo funciona bien para los otros dos tipos de funciones -> funciones que devuelven un valor y las funciones que son solo una consulta SELECT (como una vista) funcionan bien. Incluso puede definir una nueva función que devuelve el resultado de una consulta en la otra función (descompuesta) y de esta manera todo funcionará, incluso cuando se realicen enlaces nativos en los parámetros . Por ejemplo:
CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
- La conexión se vuelve muy inestable después de este error, no se puede recuperar.
- El error ocurre al intentar vincular cualquier tipo de datos.
¿Cómo puedo seguir con esto? Me gustaría hacer enlaces nativos a los parámetros de la función.
Proceso 54 generó excepción grave excepción c0000005: Usted mejor contacto con el soporte del producto. Por lo menos, informe esto en https://connect.microsoft.com/SQLServer, asegúrese de adjuntar los archivos .mdmp de la carpeta LOG del servidor. El equipo del producto puede responder con una solución alternativa. –
Oh, me perdí es SQL 2k –
@Remus Rusanu: Base de soporte para SQL Server 2000 ha terminado hace mucho tiempo. Parece que el soporte extendido no cubrirá esto. Tampoco creo que Microsoft ayude al usar el controlador odbc de freetds. – nosklo