【问题标题】:Pyodbc SQL Insert query with where condition带有 where 条件的 Pyodbc SQL 插入查询
【发布时间】:2020-02-25 12:24:40
【问题描述】:

我正在尝试使用 where (NOT IN ) 子句将数据插入表中,以避免插入重复数据

nvalue = data.value
nature = data.type
sid = data.Id
cursor.execute("INSERT INTO TABLE_NAME1 (ID, FieldName, FieldValue) VALUES (?, ?, ?) WHERE sid NOT IN (SELECT ID FROM TABLE_NAME1 )", (sid, nature, nvalue)
connection.commit()

错误

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near the keyword 'WHERE'. (156) (SQLExecDirectW); [42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Statement(s) could not be prepared. (8180)")

还尝试将 where 子句中的“sid”替换为“?” :

cursor.execute("INSERT INTO TABLE_NAME1 (ID, FieldName, FieldValue) VALUES (?, ?, ?) WHERE ? NOT IN (SELECT Id FROM TABLE_NAME1)", (sid, nature, nvalue, sid)

【问题讨论】:

  • 我猜你拼错了你传递的参数 - id 而不是 sid
  • Id 是列名,sid 是包含数据的变量名
  • 是的,在您的查询中它是相反的 - WHERE sid,然后参数是 id...

标签: python sql pyodbc


【解决方案1】:

应该使用ID,而不是sid,因为它指的是TABLE_NAME1 中每条记录的列ID。同时sidWHERE子句过滤后插入的值。两者之间没有关系。

cursor.execute("INSERT INTO TABLE_NAME1 (ID, FieldName, FieldValue) VALUES (?, ?, ?) WHERE ID NOT IN (SELECT ID FROM TABLE_NAME1 )", (id, nature, nvalue)

【讨论】:

  • 感谢您的回答,但我必须使用 sid(变量)检查表中存在的现有 ID 以避免重复
  • 它给出以下错误 - pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]关键字'WHERE'附近的语法不正确. (156) (SQLExecDirectW); [42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]无法准备语句。(8180)")
【解决方案2】:

SQL server 不支持插入 where 子句,请查看this

按照那里的建议,您可以使用

IF NOT EXISTS(SELECT 1 FROM Payments WHERE ID = ?)
INSERT INTO TABLE_NAME1(ID,FieldName,FieldValue)
VALUES(?,?,?)

使用值:

(sid, sid, nature, nvalue)

这意味着:

cursor.execute("IF NOT EXISTS(SELECT 1 FROM Payments WHERE ID = ?) INSERT INTO TABLE_NAME1(ID,FieldName,FieldValue) VALUES(?,?,?)", (sid, sid, nature, nvalue))

希望对你有帮助。

【讨论】:

  • 检查了上述建议 - pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]关键字'WHERE'附近的语法不正确. (156) (SQLExecDirectW); [42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]无法准备语句。(8180)")
  • 好的,我看到问题了,我改一下答案
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多