【问题标题】:Pyodbc, how to get results from SQL Server stored procedurePyodbc,如何从 SQL Server 存储过程中获取结果
【发布时间】:2021-09-18 10:43:08
【问题描述】:

我有一个必须使用的存储过程。来自 SQL 开发人员的结果看起来像一个表。但是当我尝试使用 Pyodbc 获得结果时,我只得到:

错误:没有结果。以前的 SQL 不是查询。

我认为这可能是产生结果的方式,因为它使用了 select。我不确定如何获得输出。我从指南和 SO 问题中尝试了其他一些想法,但没有运气。

SP 看起来像这样:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE schema.spname
AS
BEGIN

    SET NOCOUNT ON
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    BEGIN TRY
        DECLARE @NewLogID BIGINT
        DECLARE @recs INT = 0
        DECLARE @Process VARCHAR(200) = OBJECT_NAME(@@PROCID)

        -- Log the Process
        EXEC anrm.WriteANRMLog @ProcessName = @Process,@ReturnLogID=@NewLogID OUTPUT    
        SELECT receipt_id, order_id, user_id
        FROM tableA
        WHERE A.Qty>0
        AND datesent IS NULL
        
        --EXEC schema.othertable @RecordCount = @recs,@logid= @NewLogID, @ReturnLogID=@NewLogID OUTPUT
        PRINT @Process + ' - Completed'
    END TRY
    BEGIN CATCH
        EXEC anrm.PrintError
        --EXEC anrm.LogNRMError 
    END CATCH

END

我正在尝试获得结果,最近一次是这样的。

try:
    cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=' +
            server+';DATABASE='+database+';UID='+username+';PWD=' + password)
    cnxn.autocommit = True
    cursor = cnxn.cursor()
    cursor.execute("SET NOCOUNT ON; exec schema.spname")

    row = cursor.fetchone()
    while row:
        print(str(row[0]) + " " + str(row[1]))
        row = cursor.fetchone()

    cursor.close()
    del cursor
    cnxn.close()

except Exception as e:
    print("Error: %s" % e)

【问题讨论】:

  • SET NOCOUNT ON;cursor.execute("SET NOCOUNT ON; exec schema.spname") 中是多余的,因为它已被指定为存储过程中的第一条语句。您可能需要检查 anrm.WriteANRMLog 以确保它没有像 SET NOCOUNT OFF; 那样做一些愚蠢的事情。
  • WriteANRMLog 没有任何看起来很麻烦的东西。它还设置 nocount on。

标签: python sql sql-server stored-procedures pyodbc


【解决方案1】:

你能修改 SP 吗?如果是这样,不要在 SP 中运行选择,而是让它将结果插入到临时表中。然后在python中

cursor.execute("exec schema.spname")
cursor.execute("select * from #my_temp_table")
cursor.execute("drop table #my_temp_table")

【讨论】:

    【解决方案2】:

    这对你有用吗?

    # SQL Server format
    cursor.execute("exec sp_dosomething(123, 'abc')")
    
    # ODBC format
    cursor.execute("{call sp_dosomething(123, 'abc')}")
    

    【讨论】:

    • 这如何调用存储过程?
    • 对不起,我分心了,复制/粘贴了错误的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多