형식화된 XML과 형식화되지 않은 XML 비교
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
xml 유형의 변수, 매개 변수 및 열을 만들 수 있습니다. 필요에 따라 XML 스키마 컬렉션을 변수, 매개 변수 또는 xml 형식의 열과 연결할 수 있습니다. 이 경우 xml 데이터 형식 인스턴스를 형식화된 인스턴스라고 합니다. 그렇지 않으면 XML 인스턴스를 형식화되지 않은 인스턴스라고 합니다.
잘 구성된(Well-Formed) XML 및 XML 데이터 형식
xml 데이터 형식은 ISO 표준 xml 데이터 형식을 구현합니다. 따라서 잘 구성된(Well-Formed) XML 버전 1.0 문서와 텍스트 노드가 있는 이른바 XML 콘텐츠 조각과 임의의 수의 최상위 요소를 형식화되지 않은 XML 열에 저장할 수 있습니다. 시스템은 데이터가 올바른 형식인지 확인하고, 열이 XML 스키마로 바인딩되도록 요구하지 않으며, 넓은 의미에서 올바른 형식이 아닌 데이터를 거부합니다. 형식화되지 않은 XML 변수 및 매개 변수도 마찬가지입니다.
XML 스키마
XML 스키마는 다음을 제공합니다.
유효성 검사 제약 조건 형식화된 xml 인스턴스가 할당 또는 수정될 때마다 SQL Sever가 인스턴스의 유효성을 검사합니다.
데이터 형식 정보입니다. 스키마는 xml 데이터 형식 인스턴스의 특성 및 요소 형식에 대한 정보를 제공합니다. 형식 정보는 형식화되지 않은 xml에서 가능한 것보다 인스턴스에 포함된 값에 대한 보다 정확한 운영 의미 체계를 제공합니다. 예를 들어 10진수 산술 연산은 10진수 값에 대해 수행할 수 있지만 문자열 값에서는 수행할 수 없습니다. 이 때문에 형식화된 XML 스토리지는 형식화되지 않은 XML보다 훨씬 더 간결하게 만들 수 있습니다.
형식화된 XML 또는 형식화되지 않은 XML 선택
다음 경우에 형식화되지 않은 xml 데이터 형식을 사용합니다.
XML 데이터에 대한 스키마가 없습니다.
스키마가 있지만 서버에서 데이터의 유효성을 검사하지 않도록 합니다. 경우에 따라 애플리케이션이 서버에 데이터를 저장하기 전에 클라이언트 쪽 유효성 검사를 수행하거나 스키마에 따라 유효하지 않은 XML 데이터를 일시적으로 저장하거나 서버에서 지원되지 않는 스키마 구성 요소를 사용합니다.
다음 경우에 형식화된 xml 데이터 형식을 사용합니다.
XML 데이터에 대한 스키마가 있으며 서버에서 XML 스키마에 따라 XML 데이터의 유효성을 검사합니다.
형식 정보에 따라 스토리지 및 쿼리 최적화를 활용합니다.
쿼리를 컴파일하는 동안 형식 정보를 더 잘 활용합니다.
형식화된 XML 열, 매개 변수 및 변수는 XML 문서 또는 내용을 저장할 수 있습니다. 그러나 선언 시 문서 또는 콘텐츠를 저장할지 여부를 플래그로 지정해야 합니다. 또한 XML 스키마 컬렉션을 제공해야 합니다. 각 XML 인스턴스에 정확히 하나의 최상위 요소가 있는 경우 DOCUMENT를 지정합니다. 그렇지 않으면 CONTENT를 사용합니다. 쿼리 컴파일러는 쿼리 컴파일 중에 형식 검사에서 DOCUMENT 플래그를 사용하여 단일 항목인 최상위 요소를 유추합니다.
형식화된 XML 만들기
형식화된 xml 변수, 매개 변수 또는 열을 만들려면 먼저CREATE XML SCHEMA COLLECTION(Transact-SQL)을 사용하여 XML 스키마 컬렉션을 등록해야 합니다. 그러면 XML 스키마 컬렉션을 변수, 매개 변수 또는 xml 데이터 유형의 열과 연결할 수 있습니다.
다음 예에서는 XML 스키마 컬렉션 이름을 지정하기 위해 두 부분으로 된 명명 규칙이 사용됩니다. 첫 번째 부분은 스키마 이름이고, 두 번째 부분은 XML 스키마 컬렉션 이름입니다.
예시: 스키마 컬렉션을 xml 형식 변수와 연결합니다.
다음 예시에서는 xml 형식 변수를 만들고 이를 스키마 컬렉션에 연결합니다. 예시에 지정된 스키마 컬렉션은 AdventureWorks 데이터베이스에서 이미 가져왔습니다.
DECLARE @x xml (Production.ProductDescriptionSchemaCollection);
예시: xml 형식 열에 대한 스키마 지정
다음 예에서는 xml 유형 열이 포함된 테이블을 만들고 이 열에 대한 스키마를 지정합니다.
CREATE TABLE T1(
Col1 int,
Col2 xml (Production.ProductDescriptionSchemaCollection));
예시: XML 형식 매개 변수를 저장 프로시저에 전달
다음 예에서는 xml 유형 매개 변수를 저장 프로시저에 전달하고 해당 변수에 대한 스키마를 지정합니다.
CREATE PROCEDURE SampleProc
@ProdDescription xml (Production.ProductDescriptionSchemaCollection)
AS
...
XML 스키마 컬렉션에 대해 다음 사항에 유의하세요.
XML 스키마 컬렉션은 XML 스키마 컬렉션 만들기를 사용하여 등록한 데이터베이스에서만 사용할 수 있습니다.
또한 문자열을 형식화된 xml 데이터 형식으로 캐스팅하는 경우 구문 분석 시 지정된 컬렉션에 있는 XML 스키마 네임스페이스에 따라 유효성 검사와 형식 지정도 수행됩니다.
형식화된 xml 데이터 형식에서 형식화되지 않은 xml 데이터 형식으로 캐스팅할 수 있으며 그 반대의 경우도 마찬가지입니다.
SQL Server에서 XML을 생성하는 다른 방법에 대한 자세한 내용은 XML 데이터의 인스턴스 만들기를 참조하세요. XML을 생성한 후 xml 데이터 형식 변수에 할당하거나 xml 유형 열에 저장하여 추가 처리를 수행할 수 있습니다.
데이터 형식 계층 구조에서 xml 데이터 형식은 sql_variant 및 사용자 정의 형식 아래에 표시되지만 기본 제공 형식보다 우선합니다.
예시: 형식화된 XML 열을 제한하는 패싯 지정
형식화된 xml 열의 경우 열에 저장된 각 인스턴스에 대해 최상위 요소 하나만 허용하도록 열을 제한할 수 있습니다. 다음 예시와 같이 테이블을 만들 때 선택적 DOCUMENT
패싯을 지정하여 이 작업을 수행합니다.
CREATE TABLE T(Col1 xml
(DOCUMENT Production.ProductDescriptionSchemaCollection));
GO
DROP TABLE T;
GO
기본적으로 형식화된 xml 열에 저장된 인스턴스는 XML 문서가 아닌 XML 콘텐츠로 저장됩니다. 이렇게 하면 다음을 수행할 수 있습니다.
0개 이상의 최상위 요소
최상위 요소의 텍스트 노드
다음 예시와 같이 CONTENT
패싯을 추가하여 이 동작을 명시적으로 지정할 수도 있습니다.
CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection));
GO -- Default
xml 형식(형식화된 xml)을 정의하는 모든 위치에서 선택적 DOCUMENT/CONTENT 패싯을 지정할 수 있습니다. 예를 들어 형식화된 xml 변수를 만들 때 다음과 같이 DOCUMENT/CONTENT 패싯을 추가할 수 있습니다.
declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);
DTD(문서 종류 정의) 지원
xml 데이터 형식 열, 변수 및 매개 변수는 DTD가 아닌 XML 스키마를 사용하여 입력할 수 있습니다. 그러나 형식화되지 않은 XML과 형식화된 XML 모두에 인라인 DTD를 사용하여 기본값을 제공하고 엔터티 참조를 확장된 형식으로 바꿀 수 있습니다.
타사 도구를 사용하여 DTD를 XML 스키마 문서로 변환하고 XML 스키마를 데이터베이스에 로드할 수 있습니다.
SQL Server 2005에서 형식화된 XML 업그레이드
SQL Server 2008(10.0.x)은 lax 유효성 검사 지원, xs:date, xs:time 및 xs:dateTime 인스턴스 데이터의 처리 개선, 목록 및 공용 구조체 형식에 대한 지원 추가 등 XML 스키마 지원에 대한 여러 확장을 수행했습니다. 대부분의 경우 변경 내용은 업그레이드 환경에 영향을 주지 않습니다. 그러나 xs:date, xs:time 또는 xs:dateTime(또는 하위 형식) 형식의 값을 허용하는 SQL Server 2005(9.x)에서 XML 스키마 컬렉션을 사용한 경우 SQL Server 2005(9.x) 데이터베이스를 이후 버전의 SQL Server에 연결할 때 다음 업그레이드 단계가 수행됩니다.
모든 XML 열의 경우, 이 열이 xs:anyType, xs:anySimpleType, xs:date 또는 해당 하위 유형, xs:time 또는 해당 하위 유형, xs:dateTime 또는 해당 하위 유형으로 형식화되거나 이러한 유형이 포함된 공용 구조체나 목록 유형으로 형식화된 요소나 특성이 들어 있는 XML 스키마 컬렉션으로 형식화되면 다음과 같은 상황이 발생합니다.
열의 모든 XML 인덱스를 사용할 수 없게 됩니다.
모든 SQL Server 2005(9.x) 값은 Z 표준 시간대로 정규화되었으므로 Z 표준 시간대에 계속 표시됩니다.
1년 1월 1일보다 작은 xs:date 또는 xs:dateTime 값은 인덱스가 다시 작성되거나 해당 값이 포함된 xml 데이터 형식에 대해 XQuery 또는 XML-DML 문이 실행될 때 런타임 오류가 발생합니다.
xs:date 또는 xs:dateTime 패싯의 음수 연도 또는 XML 스키마 컬렉션의 기본값은 기본 xs:date 또는 xs:dateTime 형식에서 허용하는 가장 작은 값으로 자동으로 업데이트됩니다(예: r xs:dateTime의 경우 0001-01-01T00:00:00.0000000Z).
음수 연도가 포함된 경우에도 Transact-SQL SELECT 문을 사용하여 전체 xml 데이터 형식을 검색할 수 있습니다. 음수 연도를 새로 지원되는 범위 내의 연도로 바꾸거나 요소 또는 특성의 형식을 xs:string으로 변경하는 것이 좋습니다.