我正在尝试使用以下代码从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?'
答案 0 :(得分:0)
基本上是一长串插入语句
由于您的SQL文本不是以SET NOCOUNT ON;
开头,所以每个INSERT语句都会生成一个更新计数,该更新计数已排队,因此可以将其返回到Python应用程序,并且该队列可以保留多长时间是。
因此,只需在您的SQL文本前面加上SET NOCOUNT ON;
,就可以避免该问题。
(有关更详尽的讨论,请参见this GitHub issue。)