使用来自 python 的内部游标执行 SQL 查询

Execute a SQL query with internal cursor from python

我正在进行一个研究项目,需要生成多个临时 tables 供我分析。创建这些 table 的查询如下所示:

DECLARE crsr CURSOR FORWARD_ONLY FOR
  SELECT DISTINCT 
    YEAR(s.date) AS Jahr, 
    MONTH(s.date) AS Monat
  FROM ##preliminary_data___id__ AS s;

OPEN crsr;
FETCH NEXT FROM crsr
INTO
  @year, @month;
WHILE @@fetch_Status = 0
BEGIN
  PRINT 'Next Date -------------------------------------'
  DECLARE @date DATE = DATEFROMPARTS(@year, @month, 1);
  PRINT @date;

  INSERT INTO ##final_data___id__(--snip--)
  SELECT 
    --snip--

  FETCH NEXT FROM crsr
  INTO @year, @month;
 
END;

CLOSE crsr;
DEALLOCATE crsr;

从 MS SSMS 执行的查询按预期工作。我有大约 15k 个主题,所以我想自动生成这些 table,最好使用 python。当我使用 sqlalchemy 时,这是我的代码:

engine = sqlalchemy.create_engine(cxn_str)
with engine.raw_connection().cursor() as cursor:
    cursor.execute(query)
    cursor.commit()

运行成功,但生成的##final_data___id__只包含一个月的数据。它还运行得非常快,这让我假设 FETCH NEXT FROM crsr 从未真正执行过。

我如何从 python 正确执行此查询,以便创建的 table 包含所有可用月份的数据?

这是一个针对公司数据库运行的研究项目,因此我无权创建存储过程或 tables。 ##tables 是可能持续时间最长的对象,在此设置中,这是 acceptable。

谢谢!

存储过程和匿名代码块“在 SSMS 中执行时有效”但“在从 pyodbc (Python) 连接执行时无效”的两个最常见原因是:

  1. 代码不是以SET NOCOUNT ON;开头,并且
  2. PRINT 语句。

这两种情况都可能导致服务器 return “结果”可能会掩盖代码中的预期结果,并且在某些情况下(显然像这种情况)实际上会导致代码失败,如果这些额外的“结果”多得足以溢出服务器分配给与客户端通信的缓冲区。