【问题标题】:Running multiple stored procedures using pypyodbc giving incomplete results使用 pypyodbc 运行多个存储过程会给出不完整的结果
【发布时间】:2014-06-04 17:27:21
【问题描述】:

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

我不知道。任何帮助或建议将不胜感激。

【问题讨论】:

    标签: python sql-server stored-procedures pypyodbc


    【解决方案1】:

    有几件事需要检查。一个是你的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。)

    【讨论】:

    • re: 分号 - “虽然 [SQL Server 2014] 中的大多数语句不需要分号,但在未来的版本中将需要它。” (参考:here
    • 我的意思是在 python 代码的末尾。我会澄清我的答案。谢谢
    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2011-07-14
    • 2013-08-02
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多