pymssql执行存储过程但不返回任何结果

时间:2015-11-02 01:18:45

标签: python sql-server sql-server-2012 pymssql

我正在尝试在SQL服务器上执行存储过程并使用python保存结果 - 我决定使用pymssql,因为它似乎是最简单的解决方案。

print pymssql.__version__

server = 'MY\SERVER'
user = 'user'
password = 'password'
database = 'db'
proc = 'checkin'

with pymssql.connect(server, user, password, database) as conn:
    with conn.cursor() as cursor:

        cursor.callproc(proc, (eha, ip, url, alias, location, rotation))
        conn.commit()

        f = open('/var/wwwdata/locations.txt', 'w')
        for row in cursor:
            print(row['Alias'])
            f.write(row['Alias'] + '\n')
        f.close()

SQL Query执行一些插入/更新,以

结束
SELECT Alias FROM MyTable

从SSMS运行SP可以正常工作,但是从Python运行SP会执行插入/更新功能,但不会返回任何结果。

根据pymssql documentation,这是一个已知问题。但是,我找不到有效的解决方案。

我在网上找到了一些不同的建议,包括

  • 检查了我的pymssql版本(2.1.1)
  • 使用dict=true
  • 声明光标
  • cursor.nextset()
  • 之后使用cursor.commit()
  • 使用cursor.fetchall()cursor.fetchone()获取结果,两者都会导致类似的例外:
  

OperationalError:语句未执行或已执行语句没有结果集

是否有人知道针对此特定问题的修复程序?或者是否有一个更稳定的解决方案,用于python与SQL服务器的接口(特别是对于调用存储过程)?我想我也应该问,我是否完全错了?

还认为值得注意的是:操作系统是Raspberry Pi 2 Model B上运行的Raspbian

1 个答案:

答案 0 :(得分:6)

我设法解决了这个问题。调用conn.commit()会使光标失去结果。我可能误读了一些pymssql文档并错误地添加了这行 - 代码在没有它的情况下工作得很完美。

编辑:我注意到我做了这个更改后,存储过程会返回结果,但是过程的插入/更新部分没有保存。现在我很清楚conn.commit()正在做什么。如果存储过程返回结果并对数据库进行更改,则需要在获取后调用conn.commit()

server = 'MY\SERVER'
user = 'user'
password = 'password'
database = 'db'
proc = 'checkin'

with pymssql.connect(server, user, password, database) as conn:
    with conn.cursor() as cursor:
        cursor.callproc(proc, (eha, ip, url, alias, location, rotation))
        cursor.nextset()
        results = cursor.fetchall()
        conn.commit()
        f = open('/var/wwwdata/locations.txt', 'w')
        for result in results:
            print result[0]
            f.write(result[0])
        f.close()