【发布时间】: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