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:
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:
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()