개인 공부/데이터베이스

[mssql] merge문에서 '조건이 필요한 컨텍스트에 부울이 아닌 유형의 식이 지정되었습니다'라는 오류 메시지 발생

chaeD2 2023. 3. 27. 13:42

두 테이블이 있는데, A 테이블에서의 c 컬럼의 값이 B 테이블에서의 c 컬럼 값에 존재한다면 insert를 해야 했다. 그래서 merge문을 사용했는데, 문제가 생겼었다.

 

		MERGE INTO A AS a
		USING B AS b
			ON (a.c = b.c)
		WHEN NOT MATCHED THEN
			INSERT A VALUES (~);

이런 식으로 작성했었다가 '조건이 필요한 컨텍스트에 부울이 아닌 유형의 식이 지정되었습니다' 라는 오류 메시지가 떴었다.

 

		MERGE INTO A AS a
		USING B AS b
			ON (a.c = b.c)
		WHEN NOT MATCHED THEN
			INSERT (values의 컬럼명, values의 컬럼명, ...) VALUES (~);

 

insert 뒤에 타겟 테이블이 아니라 컬럼명을 지정해 주어야 되는 거였다.

 

 

 

출처: ChatGPT

더보기

해당 오류는 MERGE 문에서 WHEN NOT MATCHED THEN 절 뒤에 오는 INSERT 문에서 값을 지정할 때 컬럼명을 생략하여 발생할 수 있습니다.

이 문제를 해결하려면 INSERT 문에서 명시적으로 컬럼을 지정하거나, VALUES 키워드를 생략하고 SELECT 절을 사용하여 값을 지정하면 됩니다.

다음은 INSERT 문에서 컬럼을 명시적으로 지정하여 해결하는 방법입니다.

 

sqlCopy code
DECLARE @tbl_mail_temp TABLE (mail_sn BIGINT, to_user_sn BIGINT, mail_type TINYINT, send_date DATETIME, mail_state TINYINT, mail_title_idx INT, mail_text_idx INT, due_date DATETIME) MERGE INTO dbo.tbl_system_mail_to_all_state AS a USING @tbl_mail_temp AS b ON (a.mail_sn = b.mail_sn) WHEN NOT MATCHED THEN INSERT (mail_sn, to_user_sn, mail_state) VALUES (b.mail_sn, @user_sn, 2);

위 예제에서는 INSERT 문에서 mail_sn, to_user_sn, mail_state 컬럼을 명시적으로 지정하였습니다. 따라서 오류가 발생하지 않습니다.

만약 VALUES 키워드를 생략하고 SELECT 절을 사용하여 값을 지정하려면 다음과 같이 작성할 수 있습니다.

sqlCopy code
DECLARE @tbl_mail_temp TABLE (mail_sn BIGINT, to_user_sn BIGINT, mail_type TINYINT, send_date DATETIME, mail_state TINYINT, mail_title_idx INT, mail_text_idx INT, due_date DATETIME) MERGE INTO dbo.tbl_system_mail_to_all_state AS a USING @tbl_mail_temp AS b ON (a.mail_sn = b.mail_sn) WHEN NOT MATCHED THEN INSERT (mail_sn, to_user_sn, mail_state) SELECT b.mail_sn, @user_sn, 2;

위 예제에서는 VALUES 대신 SELECT 절을 사용하여 값을 지정하였습니다. SELECT 절에서는 컬럼명을 명시적으로 지정하지 않아도 됩니다.