使用pypyodbc运行多个存储过程时结果不完整

1 投票
1 回答
2769 浏览
提问于 2025-04-18 08:36

我正在运行一个相对简单的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条。

我不知道。任何帮助或建议都非常感谢。

1 个回答

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代码行末尾加的分号(;)其实是多余的,可能会在你的循环中引起一些奇怪的问题。(不过SQL的分号可以保留。)

撰写回答