두 테이블이 있는데, 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 절에서는 컬럼명을 명시적으로 지정하지 않아도 됩니다.
'개인 공부 > 데이터베이스' 카테고리의 다른 글
[mssql] select 결과를 랜덤하게 셔플해서 보여주고 싶을 때 (0) | 2023.07.20 |
---|---|
[mssql] select문과 @@ROWCOUNT (0) | 2023.04.20 |
[mssql] 집계함수 group by (0) | 2023.02.24 |
select top 에 변수 사용하기 (0) | 2023.02.20 |
[mssql] nvarchar, varchar (0) | 2023.02.16 |