본문 바로가기

반응형

프로그래밍/MSSQL

(76)
[MSSQL] MERGE를 사용하여 데이터 입력/수정/삭제를 한 번에 처리 데이터 입력/수정/삭제를 한 번에 처리할 수 있는 MERGE에 대해 알아보자 MERGE 단일 문에서 여러 DML(INSERT, UPDATE, DELETE) 작업을 수행할 수 있다. 즉, 여러 개의 개별 DML문을 단일 문으로 대체할 수 있다. 작업이 하나의 문 내에서 수행되면서, 데이터가 처리되는 횟수가 최소화되고 쿼리 성능이 향상된다. MERGE는 다음과 같이 사용한다. MERGE 변경될테이블명 AS A USING 기준테이블명 AS B ON A.컬럼명 = B.컬럼명 WHEN MATCHED THEN 일치할때쿼리문 WHEN NOT MATCHED THEN 불일치할때쿼리문 아래와 같이 기준 테이블의 칼럼을 지정할 수 있다. 또한, MATCHED, NOT MATCHED와 함께 추가 조건 지정도 가능하다. MER..
[MSSQL] ALL, ANY, SOME (하위 쿼리에서 값을 둘 이상 반환했습니다.) ALL, ANY, SOME 하위 쿼리 (서브 쿼리)의 결괏값이 2개 이상일 경우 사용 서브 쿼리란 SELECT 안에 또 다른 SELECT가 들어간 형태를 의미한다. SELECT 컬럼명 FROM [테이블A] WHERE 컬럼명 조건연산자 (SELECT 컬럼명 FROM [테이블B] WHERE 조건) 예제 테이블 A에서 특정 값을 출력하려고 하는데, 조건은 테이블B에서 이름이 꽁쥐인 값보다 큰 값이다. A B 번호 값 이름 값 1 40 윤선생 40 2 20 꽁쥐 10 3 40 꽁쥐 30 4 60 SELECT 번호, 값 FROM A WHERE 값 >= (SELECT 값 FROM B WHERE 이름 = '꽁쥐') 위의 쿼리는 테이블B에서 꽁쥐의 데이터가 2개 존재하기 때문에 오류가 발생한다. 테이블A에서 값을 출력..
[MSSQL] RAISERROR 프로시저 오류 처리 RAISERROR('메시지', 오류심각도, 상태 [옵션]) 메시지 사용자 정의 메시지 (최대 2,047자) 오류 심각도 1~10 : 일반 사용자 정보 11~16 : 사용자 정의 오류 17~25 : 시스템 오류 - 심각도를 10 이하로 주면 로그만 쌓이고 프로시저 수행에는 아무런 영향을 미치지 않는다. - 심각도를 11 이상을 주면 실제 오류가 발생되어 프로시저를 호출한 Application에서도 오류가 발생하게 된다. - 모든 사용자는 0부터 18까지의 심각도를 지정할 수 있고, 19부터 25까지는 sysadmin 고정 서버 역할의 멤버 또는 ALTER TRACE 권한을 가진 사용자만이 지정할 수 있다. - 20부터 25까지의 심각도는 치명적인 심각도로, 발생 시 클라이언트 연결이 종료되고 오류 및 애플..
[MSSQL] GROUP BY COUNT (NULL 포함 집계) 데이터를 특정 칼럼을 기준으로 집합으로 묶어 행의 개수를 집계할 때 GROUP BY, COUNT를 사용한다. COUNT(칼럼)의 경우에는 NULL인 행은 카운트에 포함시키지 않지만, NULL도 포함시켜 행의 개수를 집계하고 싶다. CASE WHEN 으로 칼럼의 값이 NULL일 경우 'NULL'로 치환하여 카운트가 되도록 한다. SELECT 칼럼, COUNT(CASE WHEN 칼럼 IS NULL THEN 'NULL' ELSE 칼럼 END) AS CNT FROM 테이블 GROUP BY 칼럼 예제 데이터와 함께 좀 더 자세히 살펴보자 예제 다음과 같이 입고일/제품/회사 정보가 저장된 데이터가 있다. 입고일/제품과 상관없이 회사 칼럼을 기준으로 행의 개수를 집계하고 싶다. 즉, 회사별로 몇개의 행을 가지고 있는..
[MSSQL] XML 문자 파싱 오류 (XML 구문 분석: 잘못된 xml 문자입니다.) XML 문자열을 파싱 하는 도중 오류가 발생했다. 메시지 9420, 수준 16, 상태 1, 줄 4 XML 구문 분석: 줄 1, 문자 37. 잘못된 xml 문자입니다. 살펴보다 보니, 파싱된 XML 문자열에서 ''이라는 문자열이 넘어오면서 오류가 발생한 것이다. 애초에 DB로 넘기기 전 해당 문자를 치환하는 방법도 있겠지만, 저는 DB 자체에서 해당 문자열을 정규식을 통해 제거하는 방법으로 처리해보겠습니다. 검색해보니 VARBINARY를 이용해서 하는 방법들이 나오던데, 실제 해보니 XML 전체 문자열이 변경되면서 이상한 데이터를 반환해서 저는 이 방법은 패스했습니다. DECLARE@Expression VARCHAR(MAX) = 'ggmouse' -- 검색할 문자열 SELECT CON..

반응형