我正在运行一个相对简单的 python 脚本,该脚本旨在读取一个包含一系列存储过程的文本文件 - 每行一个。该脚本应该在第一行运行存储过程,移动到第二行,在第二行运行存储过程,等等。运行这些存储过程应该填充一个特定的表。
所以我的问题是这些过程没有将所有应有的结果填充到表中。例如,如果我的文件看起来像
exec myproc 'data1';
exec myproc 'data2';
其中 myproc 'data1' 应使用约 100 条记录填充此另一个表,而 myproc 'data2' 应使用约 50 条记录填充此另一个表。相反,我最终总共得到了大约 9 个结果 - 5 个来自第一个过程,4 个来自第二个过程。
我知道这些过程是有效的,因为如果我通过 OSQL 运行相同的 sql 文件(带有过程),并且我在另一个表中获得了正确的约 150 条记录,所以显然这与我的脚本有关。
这是我为此运行的代码:
import pypyodbc
conn = pypyodbc.connect(CONN_STR.format("{SQL Server}",server,database,user,password))
conn.autoCommit = True
procsFile = openFile('otherfile.txt','r+')
#loop through each proc (line) in the file
for proc in procsFile:
#run the procedure
curs = conn.cursor()
curs.execute(proc)
#commit results
conn.commit()
curs.close();
conn.close();
procsFile.close();
我认为这与程序未提交有关...或者其他什么?坦率地说,我真的不明白为什么只提交 5/100 条记录。
我不知道。任何帮助或建议将不胜感激。最佳答案
有几件事需要检查。一是你的data1实际上是一个字符串'data1',或者你想要data1的值?如果您想要字符串“data1”,则必须在其周围添加引号。因此要执行的字符串将如下所示:
exec_string = 'exec my_proc \'data1\';'
<小时/>
在您的情况下,您打开自动提交,并且手动提交整个连接。
我会注释掉自动提交行:
#conn.autoCommit = True
然后将 conn.commit() 更改为光标
curs.commit()
作为一句台词:
conn.cursor().execute('exec myproc \'data1\';').commit()
<小时/>
此外,Python 行末尾的 Python 分号 (;) 是不必要的,并且可能会在 for 循环中做一些奇怪的事情。 (不过保留 SQL。)
关于python - 使用 pypyodbc 运行多个存储过程给出不完整的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24043800/