如何解决SQL0418N错误

时间:2012-11-14 15:32:31

标签: sql db2 upsert

我正在使用下面的语句来更新/插入一些数据到表中,如果我在没有参数的情况下运行它,那很好。但是,只要我尝试使用参数执行它就会抛出:

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

我已阅读错误信息here,但我仍在努力解决为什么我的陈述不会执行。

--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;

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:12)

基本上,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

此外,由于您使用的是MERGE,因此您不必使用UPDATEINSERT部分中的参数,您可以参考{{USING中的值您传入的表格。此外,由于您在TEST_ID上匹配,因此您无需在UPDATE语句中包含该表,因为它无论如何都不会更新。 / p>