如何解决SQL0418N错误(How to resolve SQL0418N Error)

2019-06-21 04:16发布

我使用下面的语句更新/插入一些数据到一个表,如果我不带参数运行它,它的罚款。 然而,当我尝试使用它抛出参数来执行它:

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

我读过的错误信息, 在这里 ,但我仍然为什么我的发言将不会执行挣扎。

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

在此先感谢您的帮助!

Answer 1:

基本上,DB2不知道你那些参数发送什么数据类型。 我猜你无论是在旧版本的DB2(小于9.7在Linux / Unix / Windows或大型机上的版本低于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语句,因为它不会被更新,反正。



文章来源: How to resolve SQL0418N Error
标签: sql db2 upsert