2010-06-29 12 views
7

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

  1. Python 2.6.5 (paquete de ubuntu)
  2. pyodbc git tronco comprometerse eb545758079a743b2e809e2e219c8848bc6256b2
  3. unixodbc 2.2.11 (paquete de ubuntu)
  4. freetds 0,82 (paquete de ubuntu)
  5. 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.

+0

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. –

+0

Oh, me perdí es SQL 2k –

+1

@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

Respuesta

0

En última instancia, esta probablemente no es la respuesta que está buscando, pero cuando tuve que conectarme a MSSQL de Perl hace dos o tres años, ODBC + FreeTDS estuvo involucrado inicialmente, y no llegué a ninguna parte con (aunque no recuerdo los errores específicos, estaba tratando de hacerlo vinculante, y parecía ser la fuente de algunos de los problemas).

En el proyecto Perl, terminé utilizando un controlador destinado a Sybase (del que MSSQL se separó), por lo que es posible que desee analizarlo.

El pitón wiki tiene una página en Sybase y otro en SQL Server que es probable que desee tomar conocimiento de alternativas:

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

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

Cuestiones relacionadas