sql server中使用内部联接的Update语句在Python中使用pyodbc

sql server中使用内部联接的Update语句在Python中使用pyodbc,python,sql-server,pyodbc,Python,Sql Server,Pyodbc,您好,我正在尝试使用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 = ?; """.

您好,我正在尝试使用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):
当前执行(“”更新sam
设置
sam.u id=?
来自{0}sam
内部连接dbo.agreement_映射sam.agreement_id=?;
.format(tablename.replace('\'','\'\'')、am.newagreementid、am.oldagreementid)
变成

def fun(cur,tablename):
stmt=”“”\
更新sam
设置
sam.u id=?
来自{0}sam
内部连接dbo.agreement_映射sam.agreement_id=?;
.format(tablename.replace('\'''''\'''\'''))
当前执行(stmt,am.newagreementid,am.oldagreementid)
有两个问题:

首先,
'{0}'
将表名用单引号括起来,将其转换为字符串文字。SQL Server表名由方括号分隔

其次,
execute
调用中的
am.newagreementid
am.oldagreementid
引用是用Python计算的。Python代码没有声明任何名为
am
的Python变量或对象,因此这些引用无效

因此,您需要执行以下操作:

def fun(cur,tablename):
stmt=”“”\
更新sam
设置
sam.agreement\u id=am.newagreementid
来自[{0}]sam
内部连接dbo.agreement\u映射sam.agreement\u id=am.oldagreementid;
.format(tablename.replace('\'''''\'''\'''))
当前执行(stmt)

占位符的值必须在元组或列表中:
(am.newagreementid,am.oldagreementid)
@Barmar-实际上,pyodbc的情况并非如此。如前所述,
crsr.execute(stmt、paramval1、paramval2)
是受支持的。