【问题标题】:pyodbc insert query with where clause with variable values带有变量值的 where 子句的 pyodbc 插入查询
【发布时间】:2023-12-05 10:46:01
【问题描述】:

我想在 SQl 中插入不同的变量值,使用 pyodbc 的值不能出现在表中,但会出错。

变量

for data in datafield:
  id = data.Id
  iname = data.name
  ivalue = data.value
  cursor.execute("INSERT INTO Description (SrId, FieldName, FieldValue) VALUES (?, ?, ?) WHERE IN (SELECT * from Description WHERE SrId <>id AND FieldName<>iname AND FieldValue<>ivalue)", (id, iname, ivalue))
  connection.commit()

使用pyodbc与python连接Sql server

错误:语法错误

【问题讨论】:

    标签: python sql sql-server pyodbc


    【解决方案1】:

    在 SQL Server 中,没有 VALUES...WHERE 语法。考虑在table value constructor 上使用LEFT JOIN...NULL 进行插入选择以避免重复:

    # PREPARED STATEMENT WITH QMARK PLACEHOLDERS
    sql = """INSERT INTO Description (SrId, FieldName, FieldValue) 
             SELECT vals.SrId, vals.FieldName, vals.FieldValue
             FROM Description d
             LEFT JOIN (VALUES (?, ?, ?)) AS vals(SrId, FieldName, FieldValue)   
               ON d.SrId  = vals.SrId 
               AND d.FieldName = vals.FieldName
               AND d.FieldValue = vals.FieldValue
             WHERE d.SrId IS NULL 
                OR d.FieldName IS NULL
                OR d.FielValue IS NULL
          """
    
    # BIND PARAMS
    cur.execute(sql, (id, iname, ivalue))
    connection.commit()
    

    【讨论】:

    • 嗨 Parfait - 感谢您的回答,但是在运行上述脚本时,每次运行脚本时,数据都会在表中不断重复。我需要的是,一旦插入了具有特定 [ID, iname, ivalue] 的数据,就不能在第二次运行脚本时进行。
    • 查看使用表值构造函数的更新。事后看来,以前的查询是行不通的。
    【解决方案2】:

    你在行尾多了一个"

    cursor.execute("INSERT INTO Description (SrId, FieldName, FieldValue) VALUES (?, ?, ?) WHERE IN (SELECT * from Description WHERE SrId <>id AND FieldName<>iname AND FieldValue<>ivalue)", (id, iname, ivalue)")
    

    应该是

    cursor.execute("INSERT INTO Description (SrId, FieldName, FieldValue) VALUES (?, ?, ?) WHERE IN (SELECT * from Description WHERE SrId <>id AND FieldName<>iname AND FieldValue<>ivalue)", (id, iname, ivalue))
    

    【讨论】:

    • 也检查了建议的代码,但仍然是同样的错误