XML 데이터의 인스턴스 만들기

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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

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

  • 문자열 인스턴스를 캐스팅하는 형식입니다.

  • FOR XML 절과 함께 SELECT 문을 사용합니다.

  • 상수 할당 사용

  • 대량 로드 사용.

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

문자열을 캐스팅(CAST) 또는 변환(CONVERT)하여 [n][var]char, [n]text, varbinary 및 image같은 SQL Server 문자열 데이터 형식을 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 인스턴스에 BOM 또는 인코딩 선언이 있는 경우 XML 자체에 명시적 인코딩이 지정되지 않은 경우 파서는 해당 코드 페이지를 인코딩에 사용합니다. 그렇지 않으면 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을 내부적으로 나타냅니다. 사용자가 제공한 인코딩은 유지되지 않지만 구문 분석 프로세스 중에 고려됩니다.

형식 캐스트 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(Transact-SQL)를 참조하세요.

기본적으로 XML 파서는 다음 중 하나가 true인 경우 문자열 데이터를 XML로 변환할 때 중요하지 않은 공백을 삭제합니다.

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

  • xml:space 요소 또는 해당 상위 요소 중 하나에 적용되는 특성의 기본값이 있습니다.

예:

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

결과는 다음과 같습니다.

<root><child/></root>

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

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

스타일 매개 변수를 사용하지 않거나 해당 값이 0으로 설정된 경우 xml DT 인스턴스의 변환에 대해 중요하지 않은 공백이 유지되지 않습니다. 문자열 데이터를 xml DT 인스턴스로 변환할 때 CONVERT 연산자와 해당 스타일 매개 변수를 사용하는 방법에 대한 자세한 내용은 CAST 및 CONVERT(Transact-SQL)를 참조하세요.

예: 문자열 값을 형식화된 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;

FOR XML 절과 함께 SELECT 문 사용

SELECT 문에 FOR XML 절을 사용하여 결과를 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 절에서 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는 TYPE 지시문을 사용하는 FOR XML 쿼리 또는 XML 데이터 형식을 사용하여 SQL 열, 변수 및 출력 매개 변수에서 XML을 반환하는 등 다양한 서버 구문의 결과로 xml 데이터 형식 인스턴스를 클라이언트에 반환합니다. 클라이언트 애플리케이션 코드에서 ADO.NET 공급자는 이 xml 데이터 형식 정보를 서버에서 이진 인코딩으로 보내라고 요청합니다. 하지만 TYPE 지시어 없이 FOR XML을 사용하는 경우 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(Transact-SQL) 기능을 사용하면 데이터베이스에서 XML 문서를 대량으로 로드할 수 있습니다. 파일에서 데이터베이스의 xml 형식 열로 XML 인스턴스를 대량 로드할 수 있습니다. 작업 샘플은 XML 문서의 대량 가져오기 및 내보내기 예제(SQL Server)를 참조하세요. XML 문서 로드에 대한 자세한 내용은 XML 데이터 로드를 참조 하세요.

이 섹션의 내용

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

참고 항목