问题描述
我正在尝试使用 Apache nifi 中的“Executesql”处理器执行以下查询。
INSERT INTO SampleDB VALUES (${rno},'${tno}','${tval}','${lotno}','${datval}') WHERE ${rno} NOT IN (SELECT rno FROM SampleDB);
执行时出现如下错误:
Executesql[id=01781107-63a4-1204-8110-6b19db3d5ffc] 无法执行 sql 选择查询 INSERT INTO LimsOnCloud VALUES (1,'CTG123 ','ITM123 ','123 '),'123 ','INE5 (从 SampleDB 中选择 rno);对于 StandardFlowFileRecord[uuid=93db20b2-5f9f-4521-ac42-11239abb94c2,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1615281573937-132,container=default,section=1162],offset=145 offset=1162],name=098a8ad2-0dc9-4564-a242-8b4855b619b2,size=152] 由于关键字“WHERE”附近的语法不正确。;路由失败:com.microsoft.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});