6

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

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;

在此先感谢您的帮助!

4

1 回答 1

14

基本上,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,因此您不必在UPDATEorINSERT部分中使用参数,您可以参考USING您传入的表中的值。此外,由于您匹配 on TEST_ID,因此您不需要将其包含在您的UPDATE声明中,因为无论如何它都不会更新。

于 2012-11-14T15:48:49.870 回答