我试图在Apache nifi中使用'ExecuteSQL'处理器执行以下查询。
INSERT INTO SampleDB VALUES (${rno}, '${tno}', '${tval}', '${lotno}', '${datval}') WHERE ${rno} NOT IN (SELECT rno FROM SampleDB);
这里${rno}
作为流文件属性得到。
执行时出现以下错误:
ExecuteSQL[id=01781107-63a4-1204-8110-6b19db3d5ffc]无法执行SQL select查询INSERT INTO LimsOnCloud VALUES (1, 'CTG123 ', 'ITM123 ', '123 ', '5 ') WHERE 1 NOT IN (select rno FROM SampleDB);for StandardFlowFileRecord[uuid=93db20b2-5f9f-4521-ac42-11239abb94c2,claim=StandardContentClaim [resourcecclaim = standardresourcecclaim [id=1615281573937-132, container=default, section=132], offset=168254, length=152],offset=0,name=098a8ad2-0dc9-4564-a242-8b4855b619b2,size=152]由于关键字'WHERE'附近的语法不正确;sqlserver.jdbc. sqlserverexception:关键字'WHERE'附近语法错误。
不知道错误在哪里或者什么是更好的方法来实现这个
-
您应该使用适当的参数化查询
-
要使用这样的
WHERE
,您需要SELECT
。 -
您还应该明确指定要插入的列名。
-
NOT IN
在面对可空项时下降,所以更倾向于NOT EXISTS
。
INSERT INTO SampleDB
(rno, tno, tval, lotno, datval)
SELECT @rno, @tno, @tval, @lotno, @datval
WHERE NOT EXISTS (SELECT 1
FROM SampleDB
WHERE rno = @rno
);
正在抛出错误,因为它试图在表中查找名为1的列,因此,与其使用上面的方法,不如试试下面的
INSERT INTO SampleDB SELECT ${rno}, '${tno}', '${tval}', '${lotno}', '${datval}'
WHERE NOT EXISTS (SELECT 1 FROM SampleDB WHERE rno = ${rno});