如何解决SQL0418N错误

elu*_*id8 5 sql db2 upsert

我正在使用下面的语句更新/插入一些数据到表,如果我没有参数运行它,它没关系.但是,只要我尝试使用参数执行它就会抛出:

SQL0418N - 语句包含使用无类型参数标记,DEFAULT关键字或无效的空值.

我已经在这里阅读了错误信息,但我仍然在努力解决为什么我的语句不能执行.

--This statement works
MERGE Into AB.Testing_Table A
USING (VALUES('TEST', 'P')) B(TEST_ID, "ACTION")
ON (A.TEST_ID = B.TEST_ID)
WHEN NOT MATCHED THEN
INSERT (TEST_ID, "ACTION")
VALUES ('TEST', 'P')
WHEN MATCHED THEN
UPDATE SET TEST_ID = 'TEST'
,"ACTION" = 'P';

--This statement fails with error SQL0418N
MERGE Into AB.Testing_Table A
USING (VALUES(@TEST, @ACTION)) B(TEST_ID, "ACTION")
ON (A.TEST_ID = B.TEST_ID)
WHEN NOT MATCHED THEN
INSERT (TEST_ID, "ACTION")
VALUES (@TEST, @ACTION)
WHEN MATCHED THEN
UPDATE SET TEST_ID = @Test
,"ACTION" = @Action;
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

bha*_*mby 13

基本上,DB2不知道您在这些参数上发送的数据类型.我猜你要么是旧版本的DB2(在Linux/Unix/Windows上低于9.7,或者在早于10​​.1的大型机版本上),它不会进行大量的"自动"类型转换.或者您正在发送NULL值(仍然必须"打字",听起来很奇怪).

您可以通过将参数标记创建为类型化参数来解决问题(我假设数据类型在这里,使用适当的方法):

MERGE INTO AB.TESTING_TABLE A
USING (VALUES (
          CAST(@TEST AS CHAR(4))
         ,CAST(@ACTION AS CHAR(1))
       )) B(TEST_ID, "ACTION")
   ON (A.TEST_ID = B.TEST_ID)
 WHEN NOT MATCHED THEN
     INSERT (TEST_ID, "ACTION")
     VALUES (B.TEST_ID, B.ACTION)
WHEN MATCHED THEN
     UPDATE SET "ACTION" = B.ACTION
Run Code Online (Sandbox Code Playgroud)

此外,由于您正在使用MERGE,您不必使用UPDATEINSERT部分中的参数,您可以参考USING您传入的表中的值.此外,由于您匹配TEST_ID,您不需要包括在你的UPDATE陈述中,因为它无论如何都不会更新.