Pyodb c SQL Вставить запрос с условием где - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь вставить данные в таблицу с условием (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)")

Также попытался заменить "sid" в предложении where на "?" :

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

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

SQL сервер не поддерживает вставку в предложение 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))

Надеюсь, это поможет.

0 голосов
/ 25 февраля 2020

ID следует использовать вместо sid, поскольку оно ссылается на столбец ID для каждой записи в TABLE_NAME1. Между тем, sid - это значение, которое будет вставлено после фильтрации по предложению WHERE. Между ними нет никакой связи.

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