pyodbc falla sin error

Estaría interesado si alguien me puede orientar en la dirección correcta.

Tengo un proceso almacenado muy largo (que también contiene llamadas a otros procedimientos almacenados dentro de él) que actualiza varias tablas.

Si ejecuto el proc almacenado en management studio funciona bien. Si lo llamo desde pyodbc entonces:

  1. Se ejecuta durante la misma cantidad de tiempo que normalmente
  2. No consigo errores
  3. Ninguna de las tablas está destinada a actualizarse.

Ejecuto pyodbc para ejecutar procedimientos almacenados todo el tiempo y no tengo problemas. Sé que no hay nada de malo en mis conexiones o llamadas, ya que sustituyo un proceso almacenado más corto en el código de Python en el mismo lugar en el que funciona bien.

El proc almacenado genera unos pocos mensajes de “Advertencia: el valor nulo se elimina mediante un agregado u otra operación SET”, pensé que esto podría estar causando problemas, pero siempre que bash ESTABLECER ANSI_WARNINGS {ENCENDIDO | DESACTIVADO} ya sea dentro del proceso almacenado o fuera del proceso almacenado obtuve un pyodbc.ProgrammingError

¿Alguna conjetura sobre el problema?

Python 3.4 (have the same problem in 2.7), MSSQL, Windows 7 

ACTUALIZADO:

 import pyodbc as p def getconn(): server='insertsqlservername' dbase='insertdbasename' connStr=('Driver={SQL Server};SERVER=' + server + ';DATABASE=' + dbase + ';' + 'trusted=1') conn = p.connect(connStr) return conn def runSQL(): conn=getconn() cursor=conn.cursor() try: cursor.execute('exec InsertStoredProcName') conn.commit() except: print('sys.exc_info()[0]) cursor.close() conn.close() 

Solo para estar 100% en el problema parece haber dos componentes:

  • Código de Python: si uso el mismo código de Python pero cambio el proceso almacenado por otro diferente, entonces el código de Python funciona
  • Código SQL: el proc almacenado “problema” funciona en T-SQL, pero no cuando se ejecuta en pyodbc

Parece ser algo acerca de la combinación de los dos.

¿Puedes incluir tu cadena de conexión pyodbc? Parece que no está configurando la confirmación automática cuando se conecta, lo que hace que los cambios que realice se restituyan cuando se cierra la conexión. Tienes dos opciones, si este es el caso. Primero, puede configurar que se active la confirmación automática cuando se conecte:

 conn = pyodbc.connect(connection_str, autocommit=True) 

O, antes de cerrar la conexión:

 conn.commit()