다음을 통해 공유


XML 데이터 인스턴스 만들기

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance

이 문서에서는 XML 인스턴스를 생성하는 방법에 대해 설명합니다.

SQL Server에서는 다음과 같은 방법으로 XML 인스턴스를 생성할 수 있습니다:

  • 문자열 인스턴스 캐스팅.
  • SELECT 문에 FOR XML 절 사용하기.
  • 상수 할당 사용하기.
  • 대량 로드 사용하기.

형식 캐스트 문자열 및 이진 인스턴스

SQL Server의 문자열 데이터 형식, 즉 [n]varchar, [n]char, [n]text, varbinaryimagexml 데이터 형식으로 캐스팅(CAST) 또는 변환(CONVERT)하여 xml 데이터 형식으로 구문 분석할 수 있습니다. 형식화되지 않은 XML이 올바른 형식인지 확인합니다. xml 형식과 연결된 스키마가 있는 경우 유효성 검사도 수행됩니다. 자세한 내용은 형식화된 XML과 형식화되지 않은 XML 비교를 참조하세요.

XML 문서는 다른 인코딩(예: UTF-8, UTF-16, Windows-1252)으로 인코딩할 수 있습니다. 다음은 문자열 및 이진 소스 형식이 XML 문서 인코딩과 상호 작용하는 방식 및 파서의 동작 방식에 대한 규칙을 간략하게 설명합니다.

nvarchar에서는 UTF-16 또는 UCS-2와 같은 2 바이트 유니코드 인코딩을 가정하므로 XML 파서는 문자열 값을 2 바이트 유니코드로 인코딩된 XML 문서 또는 조각으로 취급합니다. 원본 데이터 형식과 호환되려면 XML 문서를 2 바이트 유니코드 인코딩으로 인코딩해야 합니다. UTF-16으로 인코딩된 XML 문서에는 UTF-16 바이트 순서 표시(BOM)가 있을 수 있지만 소스 형식의 컨텍스트를 통해 2 바이트 유니코드로 인코딩된 문서만 가능하기 때문에 반드시 필요하지는 않습니다.

varchar 문자열의 콘텐츠는 XML 파서에 의해 1 바이트 인코딩된 XML 문서/조각으로 처리됩니다. varchar 소스 문자열에 연결된 코드 페이지가 있으므로 XML 자체에 명시적 인코딩이 지정되지 않은 경우 파서는 해당 코드 페이지를 인코딩에 사용합니다. XML 인스턴스에 BOM 또는 인코딩 선언 목록이 있는 경우 BOM 또는 선언 목록은 코드 페이지와 일치해야 합니다. 그렇지 않으면 파서가 오류를 보고합니다.

varbinary 의 내용은 XML 파서로 직접 전달되는 코드 포인트 스트림으로 취급됩니다. 따라서 XML 문서 또는 조각은 BOM 또는 기타 인코딩 정보를 인라인으로 제공해야 합니다. 파서는 이 스트림을 통해서만 인코딩을 파악합니다. 즉, UTF-16으로 인코딩된 XML은 UTF-16 BOM을 제공해야 하며, BOM이 없고 선언 인코딩이 없는 인스턴스는 UTF-8로 해석됩니다.

XML 문서의 인코딩을 미리 알지 못하고 데이터를 XML로 캐스팅하기 전에 데이터가 XML 데이터 대신 문자열이나 이진 데이터로 전달된 경우 해당 데이터를 varbinary로 취급해야 합니다. 예를 들어 XML 파일을 사용하여 데이터를 읽을 때 OpenRowset(), 다음과 같이 해당 데이터가 varbinary(max) 값으로 읽히도록 지정해야 합니다.

SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

SQL Server 내부적으로 UTF-16 인코딩을 사용하는 효율적인 이진 진술으로 XML을 나타냅니다. 사용자 제공 인코딩은 유지되지 않지만 구문 분석 프로세스 중에 고려됩니다.

TYPE 캐스팅 CLR 사용자 정의 형식

CLR 사용자 정의 형식에 XML 직렬화가 지정되면 명시적으로 해당 형식의 인스턴스를 XML 데이터 형식으로 캐스팅할 수 있습니다. CLR 사용자 정의 형식의 XML serialization에 대한 자세한 내용은 CLR 데이터베이스 개체의 XML Serialization을 참조 하세요.

형식화된 XML에서 공백 처리

SQL Server에서 요소 콘텐츠 내의 공백은 시작 또는 끝 태그와 같이 태그로 표시 구분된 공백 전용 문자 데이터 시퀀스 내에서 발생하는 경우 무시되고 엔터티화되지 않습니다. (CDATA 섹션은 무시됩니다.) 이 공백 처리는 W3C(World Wide Web 컨소시엄)에서 게시한 XML 1.0 사양과 다릅니다. 이는 SQL Server의 XML 파서가 XML 1.0에 정의된 대로 제한된 수의 DTD 하위 집합만 인식하기 때문입니다. SQL Server에서 지원되는 제한된 DTD 하위 집합에 대해 정보를 자세히 알고 싶으시다면 CAST 및 CONVERT를 참조하세요.

기본값으로 XML 파서는 다음 옵션 중 하나가 true인 경우 스트링 데이터를 XML로 변환할 때 중요하지 않은 공백을 삭제합니다.

  • xml:space 특성은 한 요소 또는 한 요소의 상위 요소에 정의되어 있지 않습니다.

  • xml:space요소에 효과적인 특성 또는 상위 요소는 기본값입니다.

예시:

DECLARE @x XML;
SET @x = '<root>      <child/>     </root>';
SELECT @x;

결과 집합은 다음과 같습니다.

<root><child/></root>

그러나 이 동작을 변경할 수 있습니다. xml DT instance의 공백을 유지하려면 CONVERT 연산자와 선택적 스타일 매개 변수를 기본값 1로 설정합니다. 예시:

SELECT CONVERT(XML, N'<root>      <child/>     </root>', 1);

스타일 매개 변수를 사용하지 않거나 해당 기본값이 0으로 설정된 경우 xml DT instance의 전환에 대해 중요하지 않은 공백이 유지되지 않습니다. 문자열 데이터를 xml DT instance로 변환할 때 CONVERT 연산자와 해당 스타일 매개 변수를 변환하는 방법에 대해 자세히 알고 싶으시다면 CAST 및 CONVERT를 참조하세요.

예: 문자열 값을 형식화된 XML로 캐스팅하여 열에 할당

다음 예제에서는 XML 조각이 포함된 스트링 변수를 xml 데이터 형식으로 캐스팅한 다음 xml 데이터 형식으로 저장합니다.

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);
GO

DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

다음 삽입 작업은 문자열에서 xml 유형으로 암시적으로 변환합니다.

INSERT INTO T
VALUES (3, @s);

xml 형식에 CAST 문자열을 명시적으로 지정할 수 있습니다.

INSERT INTO T
VALUES (3, CAST(@s AS XML));

또는 다음 코드 샘플과 같이 CONVERT를 사용할 수 있습니다.

INSERT INTO T
VALUES (3, CONVERT(XML, @s));

예:문자열을 형식화된 XML로 변환하여 변수에 할당

다음 예제에서는 문자열이 xml 형식으로 변환되고 xml 데이터 형식의 변수에 할당됩니다:

DECLARE @x XML;
DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);

SELECT @x;

SELECT 문에 FOR XML 절 사용

FOR XML 문에 SELECT 절을 사용하여 결과를 XML로 반환할 수 있습니다. 예시:

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT Column1, Column2
        FROM Table1, Table2
        WHERE <some_condition>
        FOR XML AUTO
)
...;

SELECT 문이 xml 데이터 형식 변수에 할당하는 동안 구문 분석되는 텍스트 XML 조각을 반환합니다.

FOR XML 쿼리 결과를 xml 형식으로 직접 반환하는 FOR XML 절에서 FOR XML 쿼리의 TYPE 지시문을 사용할 수도 있습니다.

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT @xmlDoc;

결과 집합은 다음과 같습니다.

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

다음 예제에서는 FOR XML 쿼리의 형식화된 xml 결과가 xml 형식 열에 삽입됩니다.

CREATE TABLE T1 (
    c1 INT,
    c2 XML
);
GO

INSERT T1 (c1, c2)
SELECT 1, (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT *
FROM T1;
GO

FOR XML에 대한 자세한 내용은 FOR XML (SQL Server)을 참조하세요.

참고 항목

SQL Server에서 FOR XML 지시문을 사용하는 TYPE 쿼리와 같은 여러 서버 생성 결과로 클라이언트에 xml 데이터 형식 인스턴스를 반환합니다. 또는 xml 데이터 형식을 사용하여 SQL Server 데이터베이스 엔진 열, 변수 및 출력 매개 변수로부터 XML을 반환합니다. 클라이언트 애플리케이션 코드에서 ADO.NET 공급자가 이 xml 데이터 형식 정보를 서버에서 이진 인코딩으로 보내도록 요청합니다. 하지만 FOR XML 지시문 없이 TYPE을 사용하는 경우 XML 데이터는 문자열 형식으로 반환됩니다. 어떤 경우든 클라이언트 공급자는 항상 두 형식의 XML을 처리할 수 있습니다.

상수 할당 사용

xml 데이터 형식의 인스턴스가 필요한 경우 문자열 상수도 사용할 수 있습니다. 이 할당은 XML에 대한 문자열의 암시적 CAST와 동일합니다. 예시:

DECLARE @xmlDoc XML;

SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';

이전 예제에서는 문자열을 묵시적으로 xml 데이터 형식으로 변환하고xml형식 변수에 할당합니다.

다음 예제에서는 xml 형식 열에 상수 문자열을 삽입합니다:

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);

INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

참고 항목

형식화된 XML의 경우 지정된 스키마에 대해 XML의 유효성을 검사합니다. 자세한 내용은 형식화된 XML과 형식화되지 않은 XML 비교를 참조하세요.

대량 로드 사용

향상된 OPENROWSET 기능을 사용하면 데이터베이스에서 XML 문서를 대량으로 로드할 수 있습니다. 파일에서 데이터베이스의 xml 형식 열로 XML 인스턴스를 대량 로드할 수 있습니다. 작업 예제는 XML 문서 대량 가져오기 및 내보내기 예제(SQL Server)를 참조하세요. XML 문서 로드에 대한 자세한 내용은 XML 데이터 로드를 참조하세요.

섹션 내용

문서 설명
XML 쿼리 옵션 및 보존된 데이터 데이터베이스에 저장될 때 유지되지 않는 XML 인스턴스의 부분에 대해 설명합니다.