0

我正在尝试使用 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 选择查询 INSERT INTO LimsOnCloud VALUES (1, 'CTG123', 'ITM123', '123', '5') WHERE 1 NOT IN (SELECT rno来自样本数据库);对于 StandardFlowFileRecord[uuid=93db20b2-5f9f-4521-ac42-11239abb94c2,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1615281573937-132, container=default, section=132], offset=168254, length=152],offset=0 ,name=098a8ad2-0dc9-4564-a242-8b4855b619b2,size=152] 由于关键字“WHERE”附近的语法不正确。;路由失败:com.microsoft.sqlserver.jdbc.SQLServerException:关键字“WHERE”附近的语法不正确。

无法弄清楚错误在哪里,或者有什么更好的方法来实现这一点。

4

2 回答 2

0
  • 您应该使用正确的参数化查询。

  • 要使用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
);
于 2021-03-09T11:22:13.293 回答
-1

错误被抛出,因为它试图在你的表中找到一个名为 1 的列,所以不是上面的,试试这个

INSERT INTO SampleDB SELECT ${rno}, '${tno}', '${tval}', '${lotno}', '${datval}' 
WHERE  NOT EXISTS (SELECT 1 FROM SampleDB WHERE rno = ${rno});
于 2021-03-09T10:08:06.943 回答