使用pyodbc在python中使用sql server中的内在加入更新语句



嗨,我正在尝试使用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.newagreementidam.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)

最新更新