从SQL Server存储过程中检索输出参数



尝试运行具有输出参数的MS SQL存储过程。我已经遵循了关于如何做到这一点的文档,但是当我运行我的代码时,我得到了这个错误:返回带有错误集的结果。下面是我的代码:

my_stored_procedure

CREATE PROCEDURE [dbo].[my_stored_procedure]
@IN1          INT
@IN2          INT
, @OUT          INT OUTPUT
AS
BEGIN
SET @OUT = @IN + 1  
END

myclass.py

z = sqlalchemy.sql.expression.outparam("ret_%d" % 0, type_=int)
x = 1
y = 2
exec = self.context.
execute(text(f"EXEC my_stored_procedure :x, :y, :z OUTPUT"), {"x": x, "y": y, "z": z})
result = exec.fetchall()

context.py

def execute(self, statement, args=None):     
if not args:
return self.session.execute(statement)
else:
return self.session.execute(statement, args)

有什么建议或者有人能看到我做错了什么吗?

.outparam()是在SQLAlchemy 0.4中添加的,用于解决与Oracle一起工作时的特定需求,并且仅由该方言真正使用。正如当前的SQLAlchemy文档中所提到的,处理存储过程是更特定于数据库/方言的任务之一,因为不同的DBAPI层处理存储过程的方式存在显著差异。

对于SQL Server, pyodbc Wiki在这里解释了如何做。好消息是,如果存储过程除了输出/返回值之外没有返回结果集,那么您就不需要使用原始DBAPI连接。

您的(已更正的)存储过程

CREATE PROCEDURE [dbo].[my_stored_procedure]
@IN          INT
, @OUT         INT OUTPUT
AS
BEGIN
SET @OUT = @IN + 1  
END

你可以这样写:

import sqlalchemy as sa
engine = sa.create_engine("mssql+pyodbc://scott:tiger^5HHH@mssql_199")
sql = """
SET NOCOUNT ON;
DECLARE @out_param int;
EXEC dbo.my_stored_procedure @IN = :in_value, @OUT = @out_param OUTPUT;
SELECT @out_param AS the_output;
"""
with engine.begin() as conn:
result = conn.execute(sa.text(sql), {"in_value": 1}).scalar()
print(result)  # 2

最新更新