我正在运行一个相对简单的python脚本,用于读取具有一系列存储过程的文本文件 - 每行一个。脚本应该在第一行运行存储过程,移动到第二行,在第二行运行存储过程等等。运行这些存储过程应该填充特定的表。
所以我的问题是这些程序没有填充表格,应该包含所有结果。例如,如果我的文件看起来像
exec myproc 'data1';
exec myproc 'data2';
其中myproc'data1'应该用大约100条记录填充另一个表,而myproc'data2'应该用另外约50条记录填充另一个表。相反,我最终得到了大约9个结果 - 第一次触发5次,第二次触发4次。
我知道这些程序有效,因为如果我通过OSQL运行相同的sql文件(带有procs),并且在另一个表中得到正确的~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条记录。
我不知道。任何帮助或建议将不胜感激。
答案 0 :(得分:2)
有几件事需要检查。一个是你的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。)