2012-11-14 8 views
4

아래의 문을 사용하여 테이블에 데이터를 업데이트/삽입하고, 매개 변수없이 실행하면 괜찮습니다. 그러나, 곧 그것이 발생 매개 변수를 사용하여 실행하려고 같이SQL0418N 오류를 해결하는 방법

SQL0418N을 - 성명이 지정되지 않은 매개 변수 표시 문자, DEFAULT 키워드 또는 유효하지 않은 null 값의 사용이 포함되어 있습니다.

오류 정보 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

[tag : tsql]은 Microsoft SQL Server 및 Sysbase ASE에서 지원되는 SQL의 dialect 인 transact sql을 나타냅니다. [tag : db2]는 IBM의 SQL 제품인 DB2를 의미합니다. 그들은 서로 다른 제품을 사용하기 때문에 거의 함께 사용해서는 안됩니다. 태그를 조정하십시오. –

+0

@Damien_The_Unbeliever를 정리해 주셔서 감사합니다. 나는 그것을 돌 보았다. – elucid8

답변

11

기본적으로 DB2는 사용자가 해당 매개 변수로 전송할 데이터 유형을 알지 못합니다. 필자는 Linux/Unix/Windows에서 9.7 이하의 버전 또는 10.1보다 오래된 Mainframe 버전의 DB2 버전을 사용하고있는 것으로 추측하고 있습니다.이 버전은 많은 "자동"유형 변환을 수행하지 않습니다. 또는 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을 사용하고 있기 때문에, UPDATE 또는 INSERT 부분의 매개 변수를 사용할 필요가 없으면 전달한 표의 값을 참조 할 수 있습니다. 또한 TEST_ID에 일치하므로이 값을 UPDATE에 포함 할 필요가 없습니다. 어쨌든 업데이트되지 않기 때문에

관련 문제