pyodbc:无法执行很长的sql语句

时间:2018-08-16 11:39:32

标签: python sql-server pyodbc

我正在尝试使用以下代码从python中执行一个很长的语句,该语句大约有130万个字符:

import pyodbc

conn_str = 'Driver={SQL Server}; 
SERVER=MYSERVER;DATABASE=MyDatabase;TrustedConnection=True'
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

try:
    cursor.execute("A SQL statement with 1.3m characters")
    cursor.commit()
except Exception as e:
    print(e)
finally:
    conn.close()

基本上,这是一长串插入语句。 我正在监视SQL事件探查器,因为它正在针对我的SQL Server运行,并且每次执行不同数量的INSERT语句时都会执行。它最多可插入40k个字符。然后突然停止。我在想sql语句可以容纳的最大字符数,但是由于它正在执行不同数量的语句,听起来像这里的问题?

任何人都知道这里发生了什么以及如何解决这个问题?

谢谢, 乔

编辑: 这是查询:

SET XACT_ABORT ON;
SET QUOTED_IDENTIFIER ON;

IF (select  max(id)
    from    Table1) = 87648
BEGIN

BEGIN TRY
BEGIN TRANSACTION

INSERT INTO Table1 VALUES (87649, 'G4KG72HF6','87649');
INSERT INTO Table1 VALUES (87650, 'G4KG72HF6','87650');
INSERT INTO Table1 VALUES (87651, 'GDGVFKVW6','87651');
INSERT INTO Table1 VALUES (87652, 'GYAPWLNU1','87652');
INSERT INTO Table1 VALUES (87653, 'GYAPWLNU1','87653');
INSERT INTO Table1 VALUES (87654, 'H884542A2','87654');
INSERT INTO Table1 VALUES (87655, 'HT2XM4U83','87655');
INSERT INTO Table1 VALUES (87656, 'GPD9P39C7','87656');
INSERT INTO Table1 VALUES (87657, 'J2ZBUN7Q7','87657');
INSERT INTO Table1 VALUES (87658, 'JBWS35M69','87658');
INSERT INTO Table1 VALUES (87659, 'JMU6ANZN7','87659');
INSERT INTO Table1 VALUES (87660, 'JWRLK6D48','87660');
INSERT INTO Table1 VALUES (87661, 'K6NZSPSL2','87661');


--- a lot more inserts happening here



    COMMIT
END TRY
BEGIN CATCH
        PRINT N'ERROR: ' + ERROR_MESSAGE()
    IF @@TRANCOUNT > 0
        BEGIN
        ROLLBACK
        PRINT N'Transaction rolled back' 
END
END CATCH

END

ELSE
PRINT 'Max id in Table1 != 87648, has this script been ran already?'

1 个答案:

答案 0 :(得分:0)

  

基本上是一长串插入语句

由于您的SQL文本不是以SET NOCOUNT ON;开头,所以每个INSERT语句都会生成一个更新计数,该更新计数已排队,因此可以将其返回到Python应用程序,并且该队列可以保留多长时间是。

因此,只需在您的SQL文本前面加上SET NOCOUNT ON;,就可以避免该问题。

(有关更详尽的讨论,请参见this GitHub issue。)