嗨,我正在尝试使用PYODBC在SQL Server中更新表,但我无法获得正确的语法。代码段 -
def fun(cur,tablename):
cur.execute("""UPDATE sam
SET
sam.agreement_id = ?
FROM '{0}' sam
INNER JOIN dbo.agreement_mapping am ON sam.agreement_id = ?;
""".format(tablename.replace(''', '''')),am.newagreementid,am.oldagreementid)
我遇到了错误`"名称'am"未定义"。有什么办法可以执行此更新查询?
为了清晰度重构代码,
def fun(cur,tablename):
cur.execute("""UPDATE sam
SET
sam.agreement_id = ?
FROM '{0}' sam
INNER JOIN dbo.agreement_mapping am ON sam.agreement_id = ?;
""".format(tablename.replace(''', '''')),am.newagreementid,am.oldagreementid)
变成
def fun(cur,tablename):
stmt = """
UPDATE sam
SET
sam.agreement_id = ?
FROM '{0}' sam
INNER JOIN dbo.agreement_mapping am ON sam.agreement_id = ?;
""".format(tablename.replace(''', ''''))
cur.execute(stmt, am.newagreementid, am.oldagreementid)
有两个问题:
首先, '{0}'
将表名称包装在单引号中,将其变成字符串字面。SQL Server表名是由Square Brackets界定的。
第二,在Python中评估了execute
调用中的am.newagreementid
和am.oldagreementid
参考。您的Python代码不会声明任何python变量或名为am
的对象,因此这些引用无效。
因此,您需要做类似的事情:
def fun(cur,tablename):
stmt = """
UPDATE sam
SET
sam.agreement_id = am.newagreementid
FROM [{0}] sam
INNER JOIN dbo.agreement_mapping am ON sam.agreement_id = am.oldagreementid;
""".format(tablename.replace(''', ''''))
cur.execute(stmt)