Pyodbc exec存储带有参数/输出参数的proc-更新不起作用

时间:2018-07-16 16:31:28

标签: python python-3.6 pyodbc

尝试使用详细的方法here来调用存储的proc并使用python3.6中的pyodbc执行更新。我有一种方法可以处理启动实例,而另一种方法可以将实例包装起来。

完美启动实例:

def start_instance(self, count):
    params = [1, count]
    sql = """
        DECLARE @out as int;
        EXEC [dbo].[my_sproc] @id = ?, @count = ?, @instance_id = NULL, @output = @out OUTPUT;
        SELECT @out as op;
    """
    val = self.dbObj.query(sql, params).fetchval()
    self.instance = val

结束它会产生错误:

def end_instance(self):
    params = [1, self.instance]
    sql = """
        DECLARE @out as int;
        EXEC [dbo].[my_sproc] @id = ?, @instance_id = ?, @output = @out OUTPUT;
        SELECT @out as op;
    """
    val = self.dbObj.query(sql, params).fetchval()
    print(val)

错误为pyodbc.ProgrammingError: No results. Previous SQL was not a query.

我的存储过程:

ALTER PROCEDURE [dbo].[my_sproc] @id int, @count int = NULL, @instance_id int = NULL, @output int OUTPUT
AS

IF(@instance_id IS NULL)
    BEGIN
        DECLARE @OutputTbl TABLE (ID INT)
        INSERT INTO [dbo].[my_table]([id], [record_count]) OUTPUT INSERTED.id VALUES(@id, COALESCE(@count, 0));
    END

IF(@instance_id IS NOT NULL)
    BEGIN
        UPDATE [dbo].[my_table] SET [instance_end] = GETDATE(), [records_processed] = COALESCE(@count, 0) WHERE [id] = @id AND [instance_id] = @instance_id;
        SET @output = 1
    END

我可以在SSMS中运行以下sql,它将正常运行:

DECLARE @out as int;
EXEC [dbo].[my_sproc] @id = 1, @count = NULL, @instance_id = 12, @output = @out OUTPUT;
SELECT @out as op

更新:

感谢Gord Thompson关于SET NOCOUNT ON的提示,使它开始工作。但是,我最终希望end_instance()运行atexit。我目前正在这样做:

atexit.register(self.clean_up_on_exit)

然后:

    def clean_up_on_exit(self):
        self.check_in_records()
        self.end_instance()
        self.dbObj.close_conn()

如果仅出于测试目的在end_instance()末尾致电start_instance(),我将获得预期的结果。但是,将其添加到我的clean_up_on_exit()方法中不会产生错误,但是也不起作用。

更新2:

分别注册我的功能可以解决第二个问题:

    atexit.register(self.check_in_records)
    atexit.register(self.end_instance)

0 个答案:

没有答案