在使用Python中的pymssql库执行如下格式的sql脚本时:
SELECT .....
GO
INSERT INTO ...
GO
报错,错误信息如下:
(102, b"Incorrect syntax near 'GO'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n")
关键词GO其实是一个分批处理的意思,每个被GO分隔的语句都是一个单独的事务,也就是说一个语句执行失败不会影响其它语句执行。但是在 pymssql中执行如下插入操作时,execute()一次只能处理单次事务,GO对于这里的execute()来说是无法识别的关键词,故语法报错。
conn = pymssql.connect(host=config['host'], user=config['user'], password=config['password'],database=config['database'], port=config['port'])
cur = conn.cursor()
try:
cur.execute(sql)
conn.commit()
except Exception as e:
print(e)
conn.rollback()
cur.close()
conn.close()
解决方案:
1. 脚本中删除 GO ,再执行即可。(嗯,看上去很直接,很省事,就是方法显得有点不负责任~)
2. 利用python中的sqlcmd执行sql脚本(windows环境)
import os
file_name='test.sql'
os.system("sqlcmd -S localhost -U sa -P 123456 -d DB_Name -i "+"\""+file_name+"\"" )
其他的参数,可以通过输入命令:sqlcmd /? 查看