用pyodbc执行SQL while循环

时间:2020-08-29 04:00:58

标签: python sql-server pyodbc

我编写了一个相当简单的SQL while循环,并尝试通过pyodbc游标提交它。但这没有用,尽管可以在SQL Server Management Studio中很好地工作。

我的理解是,一个游标不能传递多个语句。但是,如何执行SQL while循环呢?我知道我可以使用cursor.rowcount在python内部使用while循环来执行以下查询,但是我的问题是有关具有各种SQL函数(例如此处的while)的泛型查询。

conn = get_output_conn(env=ENVIRONMENT)
conn.autocommit=True
cursor = conn.cursor()
query = """WHILE 1 = 1
                BEGIN
                BEGIN TRANSACTION;
                   DELETE TOP(2000)
                   FROM table with(holdlock)
                   WHERE ReportDate = '2020-08-23';
                   IF @@ROWCOUNT < 1 BREAK;
                COMMIT TRANSACTION;
                END"""
cursor.execute(query)
cursor.commit()

1 个答案:

答案 0 :(得分:1)

尝试在commit transaction;语句之后测试行计数条件。以下对我有用...

import pyodbc

conn = pyodbc.connect(
    autoCommit=False,
    driver="/usr/local/lib/libtdsodbc.so",
    tds_version="7.4",
    database="StackOverflow",
    port=...,
    server="...",
    user="...",
    password="..."
)

query1 = """drop table if exists dbo.DeleteExample;"""
cursor1 = conn.cursor()
cursor1.execute(query1)
cursor1.commit()
cursor1.close()

query2 = """
select cast('2020-08-23' as date) as ReportDate
into dbo.DeleteExample
from sys.objects a, sys.objects b"""
cursor2 = conn.cursor()
cursor2.execute(query2)
# About 10,000 rows depending on your database
print(cursor2.rowcount, "rows inserted")
cursor2.commit()
cursor2.close()

query3 = """
declare @RowCount int;
while 1=1
begin
  begin transaction t1;
  delete top (2000)
  from dbo.DeleteExample
  where ReportDate = '2020-08-23';
  set @RowCount = @@RowCount;
  commit transaction t1;
  if @RowCount < 1 break;
end"""
cursor3 = conn.cursor()
cursor3.execute(query3)
# "2000" which only is the first rowcount...
print(cursor3.rowcount, "rows deleted")
cursor3.commit()
cursor3.close()

哪个输出...

% python ./example.py
(10609, 'rows inserted')
(2000, 'rows deleted')

在SSMS中执行select count(1) from StackOverflow.dbo.DeleteExample会返回计数0。

相关问题