我正在做一個研究專案,需要為我的分析生成多個臨時表。創建這些表的查詢如下所示:
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 個主題,所以我想自動生成這些表,最好使用 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 正確執行此查詢,以便創建的表包含所有可用月份的資料?
This is a research project that runs against a corporate database, therefore I have no rights to create stored procedures or tables. ##tables are the longest lasting objects that are possible, and in this setup this is acceptable.
Thanks!
uj5u.com熱心網友回復:
存盤程序和匿名代碼塊“在 SSMS 中執行時作業”但“從 pyodbc (Python) 連接執行時不作業”的兩個最常見原因是:
- 代碼不以
SET NOCOUNT ON;, 和 PRINT陳述。
這兩種情況都可能導致服務器回傳可能掩蓋代碼中預期結果的“結果”,并且在某些情況下(顯然像這種情況)如果這些額外的“結果”足夠多,實際上會導致代碼失敗溢位服務器為與客戶端通信而分配的緩沖區。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/453216.html
標籤:sql-server database tsql sqlalchemy pyodbc
上一篇:SQL資料透視和按月分組
下一篇:Excel或SQL垂直資料到水平
