반응형
XML 문자열을 파싱 하는 도중 오류가 발생했다.
메시지 9420, 수준 16, 상태 1, 줄 4
XML 구문 분석: 줄 1, 문자 37. 잘못된 xml 문자입니다.
살펴보다 보니, 파싱된 XML 문자열에서 ''이라는 문자열이 넘어오면서 오류가 발생한 것이다.
애초에 DB로 넘기기 전 해당 문자를 치환하는 방법도 있겠지만,
저는 DB 자체에서 해당 문자열을 정규식을 통해 제거하는 방법으로 처리해보겠습니다.
검색해보니 VARBINARY를 이용해서 하는 방법들이 나오던데,
실제 해보니 XML 전체 문자열이 변경되면서 이상한 데이터를 반환해서 저는 이 방법은 패스했습니다.
DECLARE @Expression VARCHAR(MAX) = '<root><name>ggmouse</name><age></age></root>' -- 검색할 문자열
SELECT CONVERT(XML, @Expression)
위의 문자열을 XML로 반환하려 했으나 오류가 발생했습니다.
바로 <age></age> 이부분 때문이죠
바로 XML 문자열에 아래 문자들이 포함되어 있을 경우 XML 변환 시 오류가 발생하게 됩니다.
�         	 
   
                   
DECLARE @Expression VARCHAR(MAX) = '<root><name>ggmouse</name><age></age></root>' -- 검색할 문자열
DECLARE @Pattern VARCHAR(MAX) = '&#x[0-9a-fA-F]' -- 찾을 부분 패턴 정규식
DECLARE @Replacement VARCHAR(MAX) = '' -- 대체 문자열
DECLARE @StartPoint INT = 0
DECLARE @EndPoint INT = 0
DECLARE @ReturnStr VARCHAR(MAX) = @Expression;
IF ISNULL(@ReturnStr,'') = ''
RETURN;
WHILE 1=1
BEGIN
-- 시작 문자열 위치 ('%&#x[0-9a-fA-F]%')
SET @StartPoint = PATINDEX('%' + @Pattern + '%', @ReturnStr)
IF ISNULL(@StartPoint,0) = 0
BREAK;
-- 종료 문자열 위치 (시작 문자열 위치 이후의 ;)
SET @EndPoint = CHARINDEX(';', @ReturnStr, @StartPoint)
-- 정규식에 맞는 문자열 제거
SET @ReturnStr = STUFF(@ReturnStr, PATINDEX('%' + @Pattern + '%', @ReturnStr), @EndPoint-@StartPoint+1, @Replacement)
END
SELECT @Expression AS 'XML 문자열'
SELECT @ReturnStr AS 'XML 결과 문자열'
[MSSQL] XML 데이터를 테이블 형태로 저장 (XML to DB)
반응형
'프로그래밍 > MSSQL' 카테고리의 다른 글
[MSSQL] RAISERROR 프로시저 오류 처리 (0) | 2021.02.25 |
---|---|
[MSSQL] GROUP BY COUNT (NULL 포함 집계) (0) | 2021.02.24 |
[MSSQL] 다중 칼럼 PIVOT 처리 (복수개의 열 행렬 변환) (0) | 2020.12.08 |
[MSSQL] TRIM/RTRIM/LTRIM 문자열 공백 및 지정 문자 제거 (0) | 2020.09.19 |
[MSSQL] GETDATE 날짜함수 (YEAR, MONTH, DAY) (0) | 2020.09.16 |