2016-04-29 33 views
5

Questa è la mia prima domanda qui. Quindi, mi dispiace se è ripetuto o la formattazione è disattivata. Ho cercato tra le altre domande e l'errore è comune ma appare in più situazioni.Errore durante la chiamata a una procedura da pyodbc

Ho un codice Python molto semplice in cui voglio eseguire una procedura in MSSQL da pyodbc.

import pyodbc 
conn = pyodbc.connect(r'DSN=myDSN') 
cursor = conn.cursor() 
query = r'{call myproc}' 
cursor.execute(query) 

Sto usando chiamata invece di exec dopo aver letto che utilizza ODBC chiamata per l'esecuzione di procedure in MSSQL.

L'errore che sto ottenendo è il seguente:

Traceback (most recent call last): 
File "myscript.py", line 26, in <module> 
cursor.execute(query) 
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]The current transaction has aborted, and any pending changes have been rolled back. Cause: A transaction in a rollback-only state was not explicitly rolled back before a DDL, DML or SELECT statement. (111233) (SQLExecDirectW)') 

Grazie per l'aiuto

+0

CALL è utilizzato per MySQL, non per MSSQL. – FlipperPA

+0

@FlipperPA - In realtà, la sintassi '{CALL ...}' è un metodo standard per chiamare stored procedure tramite ODBC (e JDBC), e ha funzionato solo con me quando l'ho provato (con pyodbc 3.0.7 e SQL Server Native Client 10.0). –

+0

Huh, mi ero imbattuto in errori con quello anni fa, ma ora che ci penso, potrebbe essere stato attraverso il DBD :: ODBC di Perl. Grazie, Gord! – FlipperPA

risposta

1

Ecco due esempi su come si può eseguire un proc memorizzato in MS SQL Server tramite pyodbc:

Passaggio di un NULL e VARCHAR "tallen" come variabili di parametri posizionali:

cursor.execute('EXEC usp_get_user_data ?, ?', None, 'flipperpa') 

Passando due valori VARCHAR come variabili parametro denominato:

cursor.execute('EXEC usp_get_user_data @user_full_name = ?, @user_username = ?', 'flip', 'flipperpa') 

Poi per scorrere i dati restituiti:

rows = cursor.fetchall() 
for row in rows: 
    # Do stuff 
    print(row.user_id) 

Buona fortuna!

2

Nel caso in cui qualcuno abbia lo stesso problema. Sono stato in grado di scoprire quali fossero i problemi. Quando si apre una connessione con DSN, l'autocommit è impostato su False. Per qualche ragione, questo dovrebbe essere True affinché il codice funzioni (ciò dipende in gran parte da ciò che stavo facendo su MSSQL).

import pyodbc 
conn = pyodbc.connect(r'DSN=myDSN', autocommit=True) 
cursor = conn.cursor() 
query = r'{call myproc}' 
cursor.execute(query) 

Questo funziona bene!

0

ho avuto problema con l'esecuzione della stored procedure utilizzando il server SQL 2008. Il primo passo che ho fatto è quello di andare al pannello di controllo> Strumenti di amministrazione> Origine dati (ODBC)> aggiungere il driver

enter image description here

L'unica modifica che ho fatto nel mio codice Python è "{call procdev_2017}". Ho ricevuto un errore quando ho provato ad utilizzare exec invece di chiamare

import pyodbc 


conn = pyodbc.connect(driver='{SQL Server Native Client 11.0}', server='XXXXXXX', database='XXX', 
         trusted_connection='yes', autocommit=True) 
bepcur = conn.cursor() 
ipcur.execute("{call procdev_2017}")