2017-12-21 15 views
1

파일로드 절차를 자동화하는 스크립트 작업 중입니다. 그래서 자연스럽게 이미 존재하는 일부 저장 프로 시저를 수행해야합니다. 내 데이터베이스에 연결하기 위해 pyodbc를 사용하고 있습니다. 나는 데이터베이스에서 완벽하게 정상적으로 SELECT 수 있지만 데이터베이스에서 실행하려고하면이 오류 얻을 :pyodbc 저장 프로 시저/Microsoft SQL Server 오류 42000

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][SQL Server Native Client 10.0] 
     Syntax error, permission violation, or other nonspecific error (0) (SQLExecDirectW)') 

내가 여기 문제가 무엇인지 알아낼 수 - 사용자 전체 DB 관리 권한을 가지고, 구문은 pyodbc 공식 문서가 말하는 바를 기반으로 정확합니다. 여기

print("Executing SP") 
conn.execute('{EXEC TEMP.s_p_test}') 
print("SP Executed.") 

, TEMP은 특정 데이터베이스에 저장 프로 시저의 유형에 대한 스키마입니다. 즉 저장 프로 시저의 전체 이름입니다. 바보처럼 뻔뻔 스러울 뿐인 것 같아.

+1

을 사용

conn.execute('{EXEC TEMP.s_p_test}') 

? trusted_credentials를 사용하고 있습니까? –

+0

UID와 PWD를 사용하고있었습니다. 나는 그것을 Trusted_Connection로 바꿨고 어떤 변경도하지 않았다. '. 명령에서 {}을 (를) 제거했으며 이제는 작동합니다. 도움을 청해 주셔서 감사합니다. 그 문서들이 날 버렸다. – dmcoding

답변

0

나는 그것을 고치기 위해 몇 가지 시도했다. @Brian Pendleton이 제안한 것처럼 UIDPWD에서 trusted_connection=True으로 정의 된 명시적인 데이터베이스 사용자에서 변경하려고했습니다. 불행히도 그것은 아무것도 바뀌지 않았습니다.

그러나 호기심에서 나는 함수 호출에서 중괄호를 사용하는 것이 무엇을하는지보기로 결정했습니다. 실행은 즉시 작동하고 원하는 출력을 생성했습니다. pyodbc의 위키에있는 문서는 나쁜 예를 보여 주거나 버그를 발견 한 것 같습니다. 복제 방법을 모르는 것은 내 상황이 비정상적인 이유를 모르기 때문입니다. 당신은`conn`을 창조 하셨 는가 어떻게

또는, 즉, 대신 내가

conn.execute('EXEC TEMP.s_p_test') 
+0

그건 내 다음 제안이 될거야. pyobdc에서 저장된 procs를 항상 사용하고 중괄호를 추가하지 않았으므로이 문제에 결코 빠지지 않았습니다. 당신이 고칠 수있어서 다행입니다. –

+0

또 다른 추천 : 꽤 오래된 드라이버 ('10.0')를 사용하고있는 것으로 보입니다. 파이썬 3에서 UTF-8 변환을 더 잘 지원하므로'11.0' 사용을 고려해 볼 수 있습니다. – FlipperPA

+1

'EXEC'에 중괄호를 사용하는 것이 문제였습니다. 저장 프로 시저를 호출하는 ODBC 표준 방법은'CALL' 키워드와 함께 중괄호를 사용하는 것입니다. –

관련 문제