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

Python pymssql执行存储过程,但不返回任何结果,python,sql-server,sql-server-2012,pymssql,Python,Sql Server,Sql Server 2012,Pymssql,我试图在SQL server上执行一个存储过程,并使用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:

我试图在SQL server上执行一个存储过程,并使用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查询执行一些插入/更新,并以

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

据报道,这是一个已知的问题。然而,我找不到有效的解决方案

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

  • 已检查我的pymssql版本(2.1.1)
  • 用dict=true声明游标
  • cursor.commit()之后使用
    cursor.nextset()
  • 使用
    cursor.fetchall()
    cursor.fetchone()
    获取结果,这两种方法都会导致类似的异常:
OperationalError:未执行语句或已执行语句没有结果集

有人知道这个问题的解决方法吗?或者,对于python与SQL server的接口(特别是调用存储过程),是否有更稳定的解决方案?我想我也应该问,我是不是完全错了


还认为这可能值得注意:操作系统是Raspbian在Raspberry Pi 2模型B上运行的吗?我已经设法解决了这个问题。调用
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()

谢谢我自己永远也不会发现这一点。谢谢你发布这篇文章——它也解决了我的一个问题。通过添加conn.commit,我能够使存储过程正常工作。我只是花了三个小时来琢磨这件事。对于python与MS SQL的交互性没有更多的问题,我感到相当惊讶。