sql server中使用内部联接的Update语句在Python中使用pyodbc
您好,我正在尝试使用pyodbc更新sql server中的表,但无法获得正确的语法。 代码片段-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 = ?; """.
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)
是受支持的。