我正在编写一个脚本来自动执行文件加载过程。因此,自然地,我需要执行一些已经存在的存储过程。我正在使用pyodbc连接到我的数据库。从数据库中可以很好地执行,但是当我尝试从数据库中执行时,会出现以下错误:

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

我不知道这里的问题是什么-用户拥有完全的数据库管理权限,根据pyodbc官方文档的说明,语法是正确的。
print("Executing SP")
conn.execute('{EXEC TEMP.s_p_test}')
print("SP Executed.")

这里,SELECT是该特定数据库中存储过程类型的架构。也就是说,它是存储过程的全名。我觉得这可能是一个愚蠢的显而易见的东西,我只是错过了。

最佳答案

我试了几件事来解决它。正如@Brian Pendleton所建议的那样,我试图将用户通过UIDPWD定义的显式数据库更改为trusted_connection=True。不幸的是,这并没有改变什么。
不过,出于好奇,我决定看看从函数调用中去掉花括号会有什么作用。执行立即生效并产生所需的输出。看起来pyodbc的wiki上的文档要么显示了不好的示例,要么我发现了一个不知道如何复制的bug,因为我不知道是什么使我的情况异常。
或者,换句话说,代替

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

我用过
conn.execute('EXEC TEMP.s_p_test')

09-07 09:22