【问题标题】:pymssql executes stored procedure but returns no resultspymssql 执行存储过程但不返回结果
【发布时间】:2016-02-01 20:16:32
【问题描述】:

我正在尝试在 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 查询执行一些插入/更新并以

结尾
SELECT Alias FROM MyTable

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

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

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

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

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

有人知道解决这个特殊问题的方法吗?或者也许有一个更稳定的 Python 与 SQL 服务器接口的解决方案(尤其是调用存储过程)?我想我也应该问,我这样做完全错了吗?

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

【问题讨论】:

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


    【解决方案1】:

    我已经设法解决了这个问题。调用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 交互的问题。
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多