SQL to XML 변환기
SQL을 붙여 넣으세요. 행, 열, NULL, 날짜까지 포함된 깔끔한 XML이 돌아옵니다.
이 도구가 하는 일
벤더, 레거시 SOAP 엔드포인트, 또는 아직도 XML을 기대하는 오래된 ETL 잡 때문에, 데이터베이스 행 뭉치를 XML 파일로 덤프해 본 적이 있다면 흐름이 뻔합니다 — 쿼리 도구 열어서 SELECT 실행하고, 내보내고, 출력을 손으로 다듬고, 날짜 포맷과 씨름하죠. 그러지 말고 여기에 SQL을 붙여 넣으면 한 번에 제대로 된 XML이 나옵니다. 다중 행 INSERT 문, 스키마만 있는 CREATE TABLE, 또는 그 둘이 섞여 있어도 결과는 똑같습니다.
변환기는 데이터베이스처럼 SQL을 읽습니다. 다중 행 INSERT의 각 행은 하나의 요소가 되고, 각 컬럼은 컬럼 이름을 딴 자식 요소가 됩니다. NULL 값은 빈 요소가 되어(그래서 모든 행의 모양이 동일하게 유지됩니다), 날짜성 리터럴 — '2024-01-15 10:30:00', DATE '2024-01-15', 혹은 raw 타임스탬프 — 은 ISO-8601 문자열로 출력됩니다. 그래서 Java, .NET, Python 등 어디에 있는 파서든 아무 문제 없이 다시 읽어 들입니다. 숫자 타입은 정밀도를 유지하고, 불리언은 true/false로 나옵니다.
public.orders나 dbo.Orders처럼 스키마가 붙은 이름은 XML 요소 이름에 점을 쓸 수 없기 때문에, 요소 이름에서는 orders나 Orders로 줄어듭니다. 따옴표 붙은 식별자, MySQL 백틱, PostgreSQL의 큰따옴표 이름도 같은 방식으로 처리됩니다. CREATE TABLE을 넣으면 그 스키마에 대한 XML 뼈대 — 컬럼마다 빈 요소 하나 — 가 나오는데, XSD 초안이나 샘플 payload를 시작하는 데 유용합니다. 한 쿼리에 테이블이 여러 개라면? 각각이 작성한 순서대로 자신만의 섹션으로 출력됩니다.
사용 방법
세 단계. 한 행을 붙이든 천 행을 붙이든 동일합니다.
SQL을 붙여 넣거나 샘플을 눌러 보세요
왼쪽 에디터에 SQL을 그대로 넣으세요. 한 행짜리든 여러 행짜리든 INSERT 문, CREATE TABLE 정의, 또는 섞인 형태 — 모두 괜찮습니다. 다중 테이블 주문 덤프가 실제로 어떻게 생겼는지 보고 싶다면 샘플 불러오기를 눌러 보세요.
주석(--과 /* ... */), 스키마 접두어, 방언별 따옴표(MySQL 백틱, SQLite 큰따옴표, SQL Server 대괄호), 끝의 세미콜론 — 전부 그대로 통과합니다. 뭔가를 미리 정리할 필요 없습니다.
변환을 누르세요
초록색 변환 버튼을 클릭하세요. 도구가 SQL을 파싱하고, 다중 행 insert의 각 행을 펼치고, 날짜와 불리언을 표준화하고, 한 번에 XML을 만듭니다. 실행 중에는 짧은 로딩 표시가 나타납니다.
XML 복사
오른쪽 패널이 들여쓰기된 올바른 형식의 XML로 채워집니다. 표준을 지키는 XML 파서라면 어떤 것이든 받아들입니다. SOAP 바디, 테스트 픽스처, ETL 드롭 폴더 등 필요한 곳에 그대로 붙여 넣으세요.
실제로 쓸 만한 순간
데이터베이스 시드 픽스처
시드 스크립트의 <code>INSERT</code>가 잔뜩 있는데, 통합 테스트나 목 서버용으로 똑같은 데이터가 XML로 필요한 상황. insert들을 붙여 넣고 XML을 가져가면 끝 — 행마다 손으로 고칠 필요 없습니다.
SOAP와 레거시 엔터프라이즈 연동
오래된 파트너 시스템이 데이터베이스 행들을 반영한 XML 바디를 기대합니다. 행을 하나씩 문자열로 만드는 중간 코드를 건너뛰고, INSERT를 바로 붙여서 XML을 SOAP 요청에 복사하세요.
감사 및 규제 대응용 내보내기
규제 당국과 감사관은 여전히 XML을 좋아합니다. 방금 INSERT한 행(또는 로그 쿼리로 뽑아낸 행)을 내보내기 파이프라인 없이도 서명 가능하고 보관 가능한 XML 문서로 변환하세요.
XML 기반 ETL 파이프라인
SSIS, Informatica, 혹은 직접 만든 XSLT 파이프라인 같은 ETL 도구에 데이터를 공급하시나요? 실제 배치 잡이 연결되기 전에, 상류의 SQL 샘플을 XML로 변환해 변환 로직을 프로토타이핑하세요.
자주 묻는 질문
다중 행 INSERT 문은 어떻게 처리되나요?
INSERT INTO orders (...) VALUES (...), (...), (...); 같은 다중 행 문은 테이블용 컨테이너 요소 하나에, 행마다 자식 요소 하나씩 붙어 나옵니다 — 각 자식은 테이블 이름의 단수형을 따릅니다(그래서 orders의 행들은 <orders> 래퍼 안의 <order> 요소가 됩니다). 모든 행은 같은 컬럼 자식들을 같은 순서로 가지므로, 수백 행이어도 출력이 예측 가능한 상태로 유지됩니다.
NULL 값은 어떻게 되나요?
VALUES 목록의 NULL은 버려지는 대신 빈 요소(예: <middle_name/>)가 됩니다. 그래야 행마다 모양이 똑같이 유지되는데, 컬럼을 위치 기반으로 순회하거나 샘플에서 XSD를 만드는 하위 소비자에게 중요합니다. xsi:nil="true"가 필요하면 출력을 작은 XSLT로 감싸거나 후처리하세요 — 변환기는 이식성을 위해 단순 빈 요소를 고수합니다.
날짜와 타임스탬프는 ISO-8601로 나오나요?
네. '2024-01-15 10:30:00', DATE '2024-01-15', TIMESTAMP '2024-01-15 10:30:00+00', MySQL식 '2024-01-15T10:30:00' 같은 SQL 리터럴은 모두 ISO-8601 문자열로 나옵니다(타임존이 있으면 2024-01-15T10:30:00Z, 없으면 그냥 2024-01-15T10:30:00). 주요 언어의 XML 스택이 모두 깔끔하게 파싱하는 포맷입니다.
행 없이 CREATE TABLE만 붙여도 되나요?
네. 스키마만 있는 CREATE TABLE은 XML 뼈대를 만들어 냅니다: 컬럼마다 빈 요소 하나가 선언 순서대로 붙습니다. 샘플 payload, XSD 초안, 손으로 채울 테스트 픽스처의 시작점으로 쓰기 좋습니다. CREATE TABLE의 데이터 타입은 힌트로 읽히지만(날짜는 날짜로, 숫자는 숫자로) 출력의 빈 요소 자체는 타입 정보를 담지 않습니다.
쿼리에 테이블이 여러 개면 어떻게 되나요?
각 INSERT나 CREATE TABLE 문은 작성 순서대로 출력 최상위에 자기만의 섹션을 만듭니다. orders를 만들고 3건의 주문을 넣은 뒤 6건의 order_items를 넣는 혼합 스크립트는 세 개의 테이블 섹션을 가진 문서가 되며, 각 섹션은 컨테이너 요소로 감싸집니다. 파서는 테이블들을 조인하거나 관계를 맺으려 하지 않고, 붙인 구조를 그대로 보존합니다.
public.orders나 dbo.Orders 같은 스키마 접두어는 제거되나요?
네. XML 요소 이름에는 점을 쓸 수 없으므로, public.orders는 <orders>로, dbo.Orders는 <Orders>로, my_schema."User Table"는 <User_Table>로 바뀝니다(XML 이름은 공백도 쓸 수 없어 공백은 밑줄로 바뀝니다). MySQL 백틱, PostgreSQL 큰따옴표, SQL Server 대괄호 모두 같은 방식으로 벗겨집니다.
함께 쓰면 좋은 도구
SQL to XML은 퍼즐의 한 조각일 뿐입니다. 다음 도구들과 잘 어울립니다: