如何通过Python调用SQL Server存储过程使结果直接存入数据库而非返回Python
解决方案
1 存储过程调整
你当前的存储过程最后插入逻辑不完整,首先补全逻辑,同时确保没有多余的查询语句产生返回结果集:
CREATE PROCEDURE dbo.TEST as set nocount on -- 已开启,作用是阻止DML操作返回影响行数,减少不必要的返回内容 IF OBJECT_ID('tempdb..#A', 'U')IS not NULL DROP TABLE #A CREATE TABLE #A ([id] [INT] identity(1,1), [CustomerName] [VARCHAR](30) NULL, [OrderCount] [INT] NULL ) ON [PRIMARY] Insert into #A ([CustomerName],[OrderCount]) values('Rajjjj',22),('Kusum',3),('Akshita',4),('John',5),('Dan',6) IF OBJECT_ID('dbo.TEST_A', 'U')IS NULL CREATE TABLE dbo.TEST_A ( [CustomerName] [VARCHAR](30) NULL, [OrderCount] [INT] NULL ); truncate table dbo.TEST_A -- 补全插入逻辑,将临时表数据写入实体表,无额外查询输出 insert into dbo.TEST_A (CustomerName, OrderCount) select CustomerName, OrderCount from #A DROP TABLE #A
全程不要添加没有写入目标的单独select语句,避免产生结果集返回至Python。
2 Python调用代码调整
需要新增两部分逻辑:主动消耗所有残留的结果集、提交事务确保数据库修改生效:
# 原有数据库连接逻辑 conn = pymssql.connect(server='你的服务器地址', user='账号', password='密码', database='数据库名') cursor = conn.cursor() storedProc = "SET NOCOUNT ON; Exec TEST;" -- 加SET NOCOUNT ON双重保险 cursor.execute(storedProc) # 消耗所有未读取的结果集,无需接收返回内容 while cursor.nextset(): pass # 必须提交事务,否则存储过程的写入操作不会在数据库生效 conn.commit() # 关闭资源 cursor.close() conn.close()
完成以上调整后,存储过程的运行结果会直接写入数据库的dbo.TEST_A表,不会有结果返回至Python。
内容的提问来源于stack exchange,提问作者Levani Zandarashvili
相关产品推荐
相关产品推荐

