在Python中使用pyodbc在sql server中使用Inner join更新语句

时间:2018-02-10 21:29:36

标签: 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 = ?;
        """.format(tablename.replace('\'', '\'\'')),am.newagreementid,am.oldagreementid)

我收到错误`" name' am'未定义"。 有什么方法可以执行此更新查询吗?

1 个答案:

答案 0 :(得分:1)

为了清晰起见,重构代码

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表名用方括号分隔。

其次,am.newagreementid调用中的am.oldagreementidexecute引用在Python中进行评估。您的Python代码不会声明任何名为am的Python变量或对象,因此这些引用无效。

相反,你需要做这样的事情:

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)