使用两个参数从 python 调用 SQL Server 中的存储过程

Calling a stored procedure in SQL Server from python with two parameters

提问人:C_Gavin 提问时间:11/15/2023 更新时间:11/16/2023 访问量:36

问:

因此,我目前正在尝试将sql server中的存储过程连接到python程序。我连接到服务器很好,可以抓取表,但是当我尝试运行我的存储过程时,我收到“此结果不返回行”错误。下面是我用来调用存储过程的代码:

import pyodbc
import sqlalchemy as sal

engine = sal.create_engine('mssql+pyodbc://{}:{}@{}/{}?driver={}'.format(username,password,server,database,driver_2))


previous_days_start_value = 1
previous_days_end_value = 10
sql_query = sal.text("EXEC clk.get_codes_pdf :previous_days_start, :previous_days_end")


pdf_df = pd.read_sql_query(sql_query, engine, params={"previous_days_start":previous_days_start_value, "previous_days_end":previous_days_end_value})

这基本上是我所说的存储过程:

ALTER PROCEDURE [gen].[get_codes] 
@previous_days_start bigint, @previous_days_end bigint
AS
BEGIN TRY
SET NOCOUNT ON;
select * from #Table;
END Try

当我在sql中执行它时,我确实得到了一个表。我可以像这样执行:

exec gen.get_codes 30,10

表格打印出来很完美。

任何帮助将不胜感激

我想从我的存储过程返回临时表。我已经使用以下方法测试了存储过程:

exec gen.get_codes 30,10

我确实得到了一张桌子作为回报。我也尝试添加

SET NOCOUNT ON;

但我仍然无法归还一张桌子。它似乎建立了连接,但随后没有表返回到我的数据帧中

python-3.x sql-server sqlalchemy pyodbc

评论

1赞 Xedni 11/15/2023
您确实意识到您在 python 中调用的存储过程与您在下面引用的存储过程不同,对吧?在你调用的 python 代码中,在后面的示例中,你调用clk.get_codes_pdfgen.get_codes
2赞 Xedni 11/15/2023
“基本上你的召唤”过程中的代码还引用了从未声明或填充的临时表。甚至不可能诊断出甚至不是有效 sql 的存储过程。
0赞 Andrew 11/15/2023
是的,向 #Table 请求数据将失败,因为它在会话级别不存在,并且您尚未创建 #Table。也可以称它为比 #Table 更多的东西,例如 #TableOfCodes。当然,您必须有一个没有 #(hash) 的实际表进行查询。在 SSMS 中调用存储的 proc 并查看 EXEC [gen]。[get_codes] 1、2

答:

0赞 SmellyCat 11/16/2023 #1

Pandas read_sql_query用于将 SQL 结果集读入 Pandas DataFrame。

您收到的错误表明您的存储过程不打算返回结果集。直接使用 SqlAlchemy 引擎(代码示例中的变量)会更合适。engine

根据注释,您还应该检查您正在测试的存储过程是否与代码尝试运行的过程相同。