我正在尝试从Python3执行.sql文件。 下面是我正在尝试的python代码
import time
userdate=time.strftime("%m_%d_%H_%M%S")
import pypyodbc as pyodbc
db_host='hostname\DBTEST'
db_name='dbname'
conn='Driver={SQL Server};Server=' + db_host + ';Database=' +db_name +
';Trusted_Connection=yes;'
db=pyodbc.connect(conn)
cursor=db.cursor()
file=open('C:\\abc\\xyz.sql','r')
line=file.read()
sql_cmd=line.split('\n')
for x in sql_cmd:
cursor.execute(x)
下面是xyz.sql脚本
DECLARE @XML XML;
DECLARE @FileName VARCHAR(1000);
DECLARE @Id UNIQUEIDENTIFIER
SELECT @Id = NEWID()
SELECT @FileName = 'ggg.xml'
SELECT @XML = '<Model>
....xml tags here...
....
</Model>'
IF EXISTS (SELECT * FROM tablename CM WHERE CM.columnname = 'test') BEGIN
UPDATE CM
SET CM.pn = '01-00001',
CM.rev= '06',
CM.Model = @XML,
CM.ModifiedOn = GETUTCDATE()
FROM cm.tablename CM
WHERE CM.columnname= 'test'
PRINT 'Updated ' + @FileName
END ELSE BEGIN
INSERT INTO cm.tablename(cmID, MN, CMType, Description, PN, Rev, CM,
RowStatus, ModifiedBy, ModifiedOn)
SELECT @Id, 'test123', 'abc.1', '', '01-00011', '01', @XML, 'A',
'74E8A3E0-E5CA-4563-BD49-12DFD210ED92', GETUTCDATE()
PRINT 'Inserted ' + @FileName
END
运行python代码时出现以下错误。
pypyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL
Server Driver][SQL Server]Must declare the scalar variable "@Id".')
DECLARE @XML XML;
DECLARE @FileName VARCHAR(1000);
DECLARE @Id UNIQUEIDENTIFIER
SELECT @Id = NEWID()
使用退出代码1完成处理
注意:如果我从M / S SQL Management studio(sql server 2016)运行sql查询,它会成功运行。 任何有关这方面的帮助将不胜感激。
答案 0 :(得分:0)
关键是不要一次执行脚本一个命令,而是使用更简单的方法将整个查询作为一个未编辑的脚本传递给cursor.execute。
以这种方式执行此操作的好处是您可以在MS Sql Server中完全开发/调试查询,然后将该过程复制到一个文件中(当然,对传递参数进行简单调整)。
作为(python 3.x,使用pyodbc)示例,我使用:
SQL_QueryName = SQL_Folder + AllAreasReportName + ".sql"
Textfile = open( SQL_QueryName, 'r' )
SQL_COMMANDS = Textfile.read()
cursor.execute( SQL_COMMANDS, ParameterList )
同样的方法应该适用于pypyodbc。
顺便说一句,如果查询必须出现在python过程中,请将整个查询放在(三重引用的)字符串中,并将该字符串传递给cursor.execute。