2016-12-23 4 views
3

파이썬에서 저장 프로 시저를 호출하려고하는데 다음 오류가 계속 발생합니다. 이 절차는 SQL Server 2008로 작성되었으며 PyODBC를 사용하여 메서드를 호출하고 매개 변수를 전달합니다. 다음과 같은 예외오류 "이전 SQL은 파이썬에서 쿼리가 아니 었습니다"?

import pyodbc 
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+serveripaddr+';DATABASE='+database+';UID='+userid+';PWD='+password+'') 
cursor = cnxn.cursor() 
cursor.execute("{call p_GetTransactionsStats('KENYA', '41')}") 
rows = cursor.fetchall() 

마지막 줄 결과 : 여기에 문제가있을 수 무엇

ProgrammingError: No results. Previous SQL was not a query. 

?

+0

두 개의 주석이 없으므로 어떤 오류가 발생합니까? – Parfait

답변

1

은 당신이 SP 당신에게 NOCOUNT ON 설정하고 먼저 SP를 수정이 문을 실행 xand 다음 SP

+0

: - 그것을 시도하고 서버에서 잘 작동하지만 파이썬에서 작동하지 않습니다. –

+0

@jessica - 오류는 확실히 저장 프로 시저 자체에서 누락 된'SET NOCOUNT ON;'*처럼 보입니다. SET NOCOUNT ON;이 저장 프로 시저의 첫 번째 실행 문인지 실제로 확인 했습니까? –

5

여기서 발생하는 상황을 호출 할 수 없습니다 경우 시도 추가 할 수 있습니다. 저장 프로 시저에는 여러 단계가 있습니다. SQL Server Management Studio에서 실행하면 각 단계에서 "(3 row(s) affected)"과 같은 별도의 메시지가 나타나는 방식을 쉽게 알 수 있으며 매우 마지막 단계에서만 응답을 생성합니다. pyodbc 커서를 통해 호출 할 때

은 분명히, 그 분리 된 각각의 단계는 모든 가능한 결과지만 매우 마지막 하나는, fetchall()를 통해 읽을 수있는 데이터가없는 별도의 resultset을 생산하고 있습니다.

따라서,이 문제를 해결하기위한 하나의 옵션은 결과를 않는 당신이 하나를 찾을 때까지 nextset()를 사용하여 이러한 결과 집합을 반복하는 것입니다, 예를 들면 :

while cursor.nextset(): # NB: This always skips the first resultset 
    try: 
     results = cursor.fetchall() 
     break 
    except pyodbc.ProgrammingError: 
     continue 

더 좋은 옵션입니다 다른 답변에서 언급 한 SET NOCOUNT ON; 지시문을 사용하면 모든 중간, 비어있는 내용을 방지 할 수 있습니다. (# rows affected) 결과 집합. 예를 들어, 지시문을 proc 호출 앞에 간단하게 추가 할 수 있습니다.

cursor.execute("set nocount on; exec MyStoredProc ?", some_parameter) 
results = cursor.fetchall()