xml 데이터 형식
xml 데이터 형식을 사용하면 XML 문서와 조각을 SQL Server 데이터베이스에 저장할 수 있습니다. XML 조각은 최상위 요소 한 개가 없는 XML 인스턴스입니다. xml 유형의 열과 변수를 만들어 데이터베이스에 XML 인스턴스를 저장할 수 있습니다. 저장된 xml 데이터 형식 인스턴스 표현은 2GB를 초과할 수 없습니다.
선택적으로 XML 스키마 컬렉션을 xml 데이터 형식의 열, 매개 변수 또는 변수와 연결할 수 있습니다. 컬렉션의 스키마는 XML 인스턴스의 유효성을 검사하고 이 인스턴스를 형식화하는 데 사용됩니다. 이 경우 XML이 형식화되었다고 합니다.
xml 데이터 형식과 관련 메서드는 XML을 SQL Server의 관계형 프레임워크에 통합하는 데 도움을 줍니다. 자세한 내용은 xml 데이터 형식 메서드를 참조하십시오.
[!참고] 이 항목에서는 형식화되지 않은 XML에 대해 설명합니다. 형식화된 XML에 대한 자세한 내용은 형식화된 XML과 형식화되지 않은 XML을 참조하십시오.
xml 데이터 형식 변수 및 열 만들기
xml 데이터 형식은 SQL Server의 기본 제공 데이터 형식이며 int 및 varchar와 같은 다른 기본 제공 유형과 비슷한 점이 있습니다. 다른 기본 제공 유형과 마찬가지로 변수 유형, 매개 변수 유형, 함수 반환 유형 또는 CAST 및 CONVERT로 테이블을 만들 때 xml 데이터 형식을 열 유형으로 사용할 수 있습니다. 이러한 사용 방법은 다음 예에서 보여 줍니다.
예 1
xml
유형 열을 만듭니다.
CREATE TABLE T1(Col1 int primary key, Col2 xml)
예 2
xml
유형의 변수를 만듭니다.
DECLARE @x xml
XML 스키마 컬렉션을 지정하여 형식화된 xml
변수를 만듭니다.
declare @x xml (Sales.StoreSurveySchemaCollection)
예 3
xml
유형 매개 변수를 저장 프로시저에 전달합니다.
CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ...
XQuery를 사용하여 열, 매개 변수 또는 변수에 저장된 XML 인스턴스를 쿼리할 수 있습니다. 또한 XML DML(XML 데이터 조작 언어)을 사용하여 XML 인스턴스에 업데이트를 적용할 수도 있습니다. XQuery 표준에서는 개발 당시 XQuery DML을 정의하지 않았으므로 SQL Server에서는 XML 데이터 수정 언어 확장을 XQuery에 도입합니다. 이러한 확장을 사용하여 작업을 삽입, 업데이트 및 삭제할 수 있습니다.
기본값 할당
테이블에서 xml 유형의 열에 기본 XML 인스턴스를 할당할 수 있습니다. 다음과 같이 두 가지 방법 중 하나로 기본 XML을 제공할 수 있습니다.
예 1
기본 XML을 XML 상수로 제공합니다. 문자열은 xml 유형으로 암시적으로 형변환됩니다.
CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')
예 2
기본 XML을 xml
에 대한 명시적 CAST
로 제공합니다.
CREATE TABLE T (XmlColumn xml
default CAST(N'<element1/><element2/>' AS xml))
SQL Server에서는 xml 유형의 열에서 NULL과 NOT NULL 제약 조건을 지원합니다. 예를 들면 다음과 같습니다.
CREATE TABLE T (XmlColumn xml NOT NULL)
제약 조건 지정
xml 유형의 열을 만들 때 열 수준이나 테이블 수준 제약 조건을 정의할 수 있습니다. 그러나 제약 조건을 지정할 때 XML 데이터 형식 메서드를 사용할 수 없습니다. 대신 다음 예처럼 사용자 정의 함수인 래퍼를 만들어 xml 데이터 형식 메서드를 래핑하고 CHECK 제약 조건에 사용자 정의 함수를 지정합니다.
다음 예에서 Col2
의 제약 조건은 이 열에 저장된 각 XML 인스턴스가 ProductID
특성을 포함하는 <<ProductDescription>
요소를 갖도록 지정합니다. 이 제약 조건은 사용자 정의 함수에 의해 적용됩니다.
CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN
RETURN @var.exist('/ProductDescription/@ProductID')
END
GO
인스턴스의 <ProductDescription>
요소에 ProductID
특성이 있으면 xml
데이터 형식의 exist()
메서드가 1
을 반환합니다. 그렇지 않으면 0
을 반환합니다.
이제 다음과 같이 열 수준 제약 조건을 가진 테이블을 만들 수 있습니다.
CREATE TABLE T (
Col1 int primary key,
Col2 xml check(dbo.my_udf(Col2)=1))
GO
다음이 삽입됩니다.
INSERT INTO T values(1,'<ProductDescription ProductID="1" />')
제약 조건 때문에 다음은 삽입되지 않습니다.
INSERT INTO T values(1,'<Product />')
테이블 수정
ALTER TABLE 문은 xml 데이터 형식을 지원합니다. 예를 들어 모든 문자열 유형 열을 xml 데이터 형식으로 변경할 수 있습니다. 이 경우 열에 포함된 문서는 올바른 형식이어야 합니다. 또한 열 유형을 문자열에서 형식화된 xml로 변경할 경우 지정된 XSD 스키마에 대해 열에 있는 문서의 유효성을 검사합니다.
CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))
GO
INSERT INTO T
VALUES (1, '<Root><Product ProductID="1"/></Root>')
GO
ALTER TABLE T
ALTER COLUMN Col2 xml
GO
xml
유형 열을 형식화되지 않은 XML에서 형식화된 XML로 변경할 수 있습니다. 예를 들면 다음과 같습니다.
CREATE TABLE T (Col1 int primary key, Col2 xml)
GO
INSERT INTO T
values (1, '<p1:ProductDescription ProductModelID="1"
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
</p1:ProductDescription>')
GO
-- Make it a typed xml column by specifying a schema collection.
ALTER TABLE T
ALTER COLUMN Col2 xml (Production.ProductDescriptionSchemaCollection)
GO
[!참고] XML 스키마 컬렉션인
Production.ProductDescriptionSchemaCollection
이 AdventureWorks 데이터베이스의 일부로 생성되기 때문에 이 스크립트는 AdventureWorks 데이터베이스에 대해 실행됩니다.
이전 예에서는 지정된 컬렉션에 있는 XSD 스키마에 대해 열에 저장된 모든 인스턴스의 유효성을 검사하고 이러한 인스턴스를 형식화합니다. 지정한 스키마에 맞지 않는 XML 인스턴스가 열에 하나 이상 있을 경우 ALTER TABLE
문이 실패하고 형식화되지 않은 XML 열을 형식화된 XML로 변경할 수 없습니다.
[!참고] 테이블이 클 경우 xml 유형 열을 수정하는 데 비용이 발생할 수 있습니다. 각 문서의 형식이 형식화된 XML로서 알맞은지 검사하고 유효성을 검사해야 하기 때문입니다.
형식화된 XML에 대한 자세한 내용은 형식화된 XML과 형식화되지 않은 XML을 참조하십시오.
뷰 만들기
xml 유형 열을 사용하여 뷰를 만들 수 있습니다. 다음 예에서는 xml
데이터 형식의 value()
메서드를 사용하여 xml
유형 열의 값을 검색하는 뷰를 만듭니다.
-- Create the table.
CREATE TABLE T (
ProductID int primary key,
CatalogDescription xml)
GO
-- Insert sample data.
INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')
GO
-- Create view (note the value() method used to retrieve ProductName
-- attribute value from the XML).
CREATE VIEW MyView AS
SELECT ProductID,
CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName
FROM T
GO
뷰에 대해 다음 쿼리를 실행합니다.
SELECT *
FROM MyView
다음은 결과입니다.
ProductID PName
----------- ------------
1 SomeName
[!참고] 분산형 분할 뷰에서는 xml 데이터 형식을 사용할 수 없습니다.
계산 열에 XML 사용
XML 인스턴스는 계산 열의 원본이나 계산 열의 유형으로 표시될 수 있습니다. 예를 들어 다음 CREATE TABLE
문에서 xml
유형 열(col2
)은 col1
에서 계산됩니다.
CREATE TABLE T(col1 varchar(max), col2 AS CAST(col1 AS xml) )
다음 CREATE TABLE
문에서와 같이 계산 열을 만들 때도 xml
데이터 형식이 원본으로 표시될 수 있습니다.
CREATE TABLE T (col1 xml, col2 as cast(col1 as varchar(1000) ))
다음 예에서와 같이 xml
유형 열에서 값을 추출하여 계산 열을 만들 수 있습니다. 계산 열을 만들 때는 xml 데이터 형식 메서드를 직접 사용할 수 없으므로 이 예에서는 XML 인스턴스에서 값을 반환하는 함수(my_udf
)를 먼저 정의합니다. 이 함수는 xml
유형의 value()
메서드를 래핑합니다. 그러면 함수 이름이 계산 열의 CREATE TABLE
문에 지정됩니다.
CREATE FUNCTION my_udf(@var xml) returns int
AS BEGIN
RETURN @var.value('(/ProductDescription/@ProductModelID)[1]' , 'int')
END
GO
-- Use the function in CREATE TABLE.
CREATE TABLE T (col1 xml, col2 as dbo.my_udf(col1) )
GO
-- Try adding a row.
INSERT INTO T values('<ProductDescription ProductModelID="1" />')
GO
-- Verify results.
SELECT col2, col1
FROM T
이전 예에서와 같이 다음 예에서는 계산 열에 대해 xml 유형 인스턴스를 반환하도록 함수를 정의합니다. 함수 내에서 xml
데이터 형식의 query()
메서드는 xml
유형 매개 변수에서 값을 검색합니다.
CREATE FUNCTION my_udf(@var xml)
RETURNS xml AS
BEGIN
RETURN @var.query('ProductDescription/Features')
END
다음 CREATE TABLE
문에서 Col2
는 함수에서 반환된 XML 데이터(<Features>
요소)를 사용하는 계산 열입니다.
CREATE TABLE T (Col1 xml, Col2 as dbo.my_udf(Col1) )
-- Insert a row in table T.
INSERT INTO T VALUES('
<ProductDescription ProductModelID="1" >
<Features>
<Feature1>description</Feature1>
<Feature2>description</Feature2>
</Features>
</ProductDescription>')
-- Verify the results.
SELECT *
FROM T
참고 항목
참조
FOR XML 및 OPENXML을 사용하여 XML 데이터 게시 및 처리
개념
형식화된 XML과 형식화되지 않은 XML
XML 인스턴스 생성
XML DML(XML 데이터 수정 언어)
xml 데이터 형식 열의 인덱스
예제 XML 응용 프로그램