Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pandas/sqlalchemy/pyodbc:SELECT之前出现UPDATE语句时,Result对象不会从存储的proc返回行_Python_Sql Server_Pandas_Sqlalchemy_Pyodbc - Fatal编程技术网

Python pandas/sqlalchemy/pyodbc:SELECT之前出现UPDATE语句时,Result对象不会从存储的proc返回行

Python pandas/sqlalchemy/pyodbc:SELECT之前出现UPDATE语句时,Result对象不会从存储的proc返回行,python,sql-server,pandas,sqlalchemy,pyodbc,Python,Sql Server,Pandas,Sqlalchemy,Pyodbc,我使用的是SQL Server 2014、pandas 0.23.4、sqlalchemy 1.2.11、pyodbc 4.0.24和Python 3.7.0。我有一个非常简单的存储过程,它对表执行更新,然后对表执行选择: CREATE PROCEDURE my_proc_1 @v2 INT AS BEGIN UPDATE my_table_1 SET v2 = @v2 ; SELECT * from my_table_1 ; END

我使用的是SQL Server 2014、pandas 0.23.4、sqlalchemy 1.2.11、pyodbc 4.0.24和Python 3.7.0。我有一个非常简单的存储过程,它对表执行更新,然后对表执行选择:

CREATE PROCEDURE my_proc_1
    @v2     INT
AS
BEGIN
    UPDATE my_table_1 
    SET v2 = @v2 
    ;

    SELECT * from my_table_1
    ;
END 
GO
这在MS SQL Server Management Studio中运行良好。但是,当我尝试使用以下代码通过Python调用它时:

import pandas as pd
from sqlalchemy import create_engine

if __name__ == "__main__":
    conn_str = 'mssql+pyodbc://@MODEL_TESTING'
    engine = create_engine(conn_str)
    with engine.connect() as conn:
        df = pd.read_sql_query("EXEC my_proc_1 33", conn)
        print(df)
我得到以下错误:

sqlalchemy.exc.ResourceClosedError:此结果对象不返回 排。它已自动关闭

(如果需要完整堆栈跟踪,请告诉我,如果需要,我将更新)


当我从存储的进程中删除更新时,代码将运行并返回结果。还要注意的是,从被更新的表之外的其他表中进行选择并没有什么区别,我会得到相同的错误。非常感谢您的帮助。

问题在于UPDATE语句返回的是一个行计数,这是一个标量值,SELECT语句返回的行“卡在”行计数后面,pyodbc无法“看到”它们(没有其他机制)


确保存储过程总是以
设置NOCOUNT为开始,这被认为是一种最佳实践
语句,禁止从DML语句(UPDATE、DELETE等)返回行计数值,并允许存储过程仅从SELECT语句返回行。

添加
SET NOCOUNT ON语句,看看这是否有帮助。这在我的测试示例中起了作用!我现在用真实的代码进行测试。请随时将此作为一个答案发布-如果它与真正的代码工作,我将很乐意接受!