728x90

-- =============================================
-- 작성일 : 2005년  03월 17일
-- 작성자 : C. H. S

-- 설   명 : 메세지를 이벤트 로그에 기록한다
-- INPUT : 사용자 정의 오류 번호, 로그에 남길 메세지

-- OUTPUT : 0 : 성공 , 1 : 실패
-- =============================================

CREATE FUNCTION dbo.UFN_LOGEVENT (@ErrNum INT, @Message VARCHAR(8000)) 
RETURNS INT AS
BEGIN
DECLARE
@RESULT INT
EXEC @RESULT = master..xp_logevent @ErrNum, @Message, WARNING
RETURN @RESULT
END


-- 실행
DECLARE @RESULT INT
EXEC @RESULT = dbo.UFN_LOGEVENT '테스트입니다'
SELECT @RESULT


-- master..xp_logevent  '사용자 정의 에러 번호', '메세지', 종류

-- WARNING 대신에 INFORMATIONAL 또는 ERROR 도 가능..

728x90

Microsoft SQL Server 2005의 XML 지원

Shankar Pal
Mark Fussell
Irwin Dolobowsky
Microsoft Corporation

2005년 5월

적용 대상:
Microsoft SQL Server

이 기사에서는 SQL Server 2005에서 기본 제공되는 XML 지원에 대해 설명합니다. .NET Framework 2.0 및 네이티브 코드의 클라이언트 쪽 프로그래밍 지원(예: OLEDB 및 SQLXML)과 XML 지원이 통합되는 방법에 대해 구체적으로 살펴봅니다.

목차

소개
XML 저장소 사용을 가속화하는 시나리오
SQL Server 2005의 서버 쪽 XML 처리
SQL Server 2005의 클라이언트 쪽 XML 처리
결론

소개

XML(eXtensible Markup Language)은 데이터 표현을 위한 플랫폼에 독립적인 형식으로 널리 채택되어 왔습니다. XML은 B2B 응용 프로그램이나 워크플로 상황에서와 같이 느슨하게 결합된 개별 시스템 사이에 정보를 교환하는 데 유용하게 사용됩니다. 데이터 교환은 XML 기술의 주요 원동력이었습니다.

XML은 반구조적 및 구조화되지 않은 데이터를 모델링하기 위해 엔터프라이즈 응용 프로그램에 점점 더 널리 사용되고 있습니다. XML이 적용되는 한 예로 문서 관리를 들 수 있습니다. 전자 메일과 같은 문서는 기본적으로 반구조적입니다. 문서가 데이터베이스 서버에 XML로 저장될 경우 문서 내용, 특정 내용 쿼리(예: 제목에 "백그라운드"라는 단어가 포함된 섹션 찾기) 및 문서 집계에 기초하여 문서를 검색하는 강력한 응용 프로그램을 개발할 수 있습니다. XML을 생성하고 사용하는 응용 프로그램이 증가함에 따라 이러한 시나리오는 실현 가능성이 점차 커지고 있습니다. 예를 들어, Microsoft Office 2003 시스템에서는 Word, Excel, Visio 및 Infopath 문서를 XML 태그로 생성할 수 있습니다.

XML 데이터에 관계형 데이터베이스를 사용하는 이유

  • XML 데이터를 관계형 데이터베이스에 저장하면 데이터 관리 및 쿼리 처리에 이점이 있습니다. SQL Server는 XML 데이터를 쿼리 및 수정하도록 확장된 관계형 데이터를 능가하는 강력한 쿼리 및 데이터 수정 기능을 제공합니다. 따라서 비용 기반 최적화 및 데이터 저장소 영역에서와 마찬가지로 이전 릴리스에 대한 투자를 계속 활용할 수 있습니다. 예를 들어, 잘 알려져 있는 관계형 데이터베이스의 인덱싱 기술은 XML 데이터 인덱싱이 가능하도록 확장되었기 때문에 비용 기반 결정을 사용하여 쿼리를 최적화할 수 있습니다.

  • XML 데이터는 기존 관계형 데이터 및 SQL 응용 프로그램과 상호 작용할 수 있으므로 데이터 모델링 요구가 증가할 경우 기존 응용 프로그램을 중단하지 않으면서 XML을 시스템에 도입할 수 있습니다. 또한 데이터베이스 서버는 XML 데이터 관리를 위한 관리 기능을 제공합니다(예: 백업, 복구 및 복제).

  • 이러한 기능으로 인해 SQL Server 2005 내에서 증가하는 XML 사용을 충족하는 네이티브 XML 지원의 요구가 점차 높아졌습니다. SQL Server 2005의 XML 지원은 엔터프라이즈 응용 프로그램 개발에 도움을 줄 것입니다.

  • 다음 절에서는 SQL Server 2000 및 2005의 XML 지원에 대한 개요를 제공하고 XML 사용을 가속화하는 몇 가지 시나리오를 설명하며 서버 쪽 및 클라이언트 쪽 XML 기능 집합에 대해 구체적으로 살펴봅니다.

SQL Server 2000의 XML 지원

이 섹션에서는 SQL Server 2000과 SQLXML 클라이언트 쪽 프로그래밍 플랫폼의 후속 웹 릴리스에서 제공되는 XML 지원에 대해 간략하게 설명합니다. 이러한 XML 지원은 관계형 데이터 모델과 XML 데이터 모델 사이에서 데이터를 매핑하기 위한 풍부한 지원을 제공합니다.

서버 쪽 지원

서버에서 XML 데이터는 SELECT 문의 FOR XML 절을 사용하여 테이블 및 쿼리 결과에서 생성될 수 있습니다. 이 방법은 데이터 교환 및 웹 서비스 응용 프로그램에 이상적입니다. FOR XML과 반대되는 것은 OpenXML이라고 부르는 관계형 행 집합 생성기 함수입니다. OpenXML은 XPath 1.0 식을 평가하여 XML 데이터에서 행 집합 열로 값을 추출합니다. OpenXML은 들어오는 XML 데이터를 테이블에 분산시키거나 쿼리를 위해 T-SQL 언어를 사용하는 응용 프로그램에 사용됩니다.

클라이언트 쪽 지원

SQL Server 2000에 대한 클라이언트 프로그래밍 지원을 SQLXML (영문)이라고 합니다. 이 기술의 핵심은 XML 스키마와 관계형 테이블 사이의 양방향 매핑을 의미하는 XML 뷰입니다. 나중에 웹 릴리스에 XSD 지원이 추가되기는 했지만 SQL Server 2000은 XDR 스키마 매핑만 지원합니다. 기본 테이블에서 경로 식을 SQL 쿼리로 변환하기 위해 매핑이 사용되고 쿼리 결과가 XML 결과로 패키지화되는 XPath 1.0의 하위 집합을 사용한 쿼리가 XML 뷰에서 허용됩니다.

또한 SQLXML을 사용하면 동적 섹션을 사용하여 XML 문서를 작성할 수 있는 XML 템플릿을 만들 수 있습니다. XML 문서에서는 매핑 쿼리 위에 FOR XML 쿼리 및/또는 XPath 1.0 식을 포함할 수 있습니다. XML 템플릿이 실행되면 쿼리 블록이 쿼리 결과로 바뀝니다. 이러한 방법을 사용하면 일부 정적 콘텐츠 및 데이터 기반의 동적 콘텐츠로 XML 문서를 만들 수 있습니다.

SQL Server 2000에는 다음 두 가지 기본 방법으로 SQLXML 기능에 액세스할 수 있습니다.

  • SQLXMLOLEDB 공급자- SQLXMLOLEDB 공급자는 ADO를 통해 Microsoft SQLXML 기능을 제공하는 OLE DB 공급자입니다.

  • HTTP 액세스- SQL Server 2000의 SQLXML 기능은 SQLXML ISAPI 필터를 사용하여 HTTP를 통해 액세스할 수도 있습니다. 제공되는 구성 도구를 사용하면 들어오는 요청을 수신하여 HTTP를 통해 XML 뷰에서 XML 템플릿, FOR XML 및 XPath 1.0 문을 실행하도록 웹 사이트를 설정할 수 있습니다.
XML 지원의 제한 사항

서버 및 클라이언트 프로그래밍 플랫폼은 테이블 형식 데이터와 XML 데이터 사이의 매핑에 기초하여 XML 데이터 생성 및 사용에 대한 풍부한 지원을 제공합니다. 또한 아주 잘 구조화된 XML 데이터도 이러한 지원을 통해 처리됩니다. SQLXML에서 쿼리 언어는 XPath 1.0의 하위 집합이며 몇 가지 제한 사항을 갖고 있습니다. 예를 들어, 하위 축(// 연산자)이 지원되지 않으므로 특정 솔루션을 개발하는 과정에 제한을 받게 됩니다. 또한 문서 관리와 같은 작업에서 필수적인 요소인 XML 문서 순서가 유지되지 않습니다. 이외에도 재귀적 XML 스키마가 지원되지 않습니다. 이러한 제한에도 불구하고 클라이언트 SQLXML 및 서버 XML 기능은 응용 프로그램 개발에서 널리 사용되어 왔습니다. SQL Server 2005는 이러한 제한을 대부분 해결하고 관계형 XML 교환 기능을 확장하며 네이티브 XML 지원을 제공합니다.

SQL Server 2005의 XML 지원 개요

이 섹션에서는 .NET Framework V2.0 및 네이티브 클라이언트 액세스 지원(예: OLE DB)을 통해 보완된 SQL Server 2005의 새로운 XML 지원에 대해 간략하게 설명합니다.

XML 데이터 형식

XML 데이터 모델이 갖고 있는 고유한 특징으로 인해 관계형 데이터 모델에 매핑하는 것이 불가능하지는 않지만 매우 어렵습니다. XML 데이터는 재귀적일 수 있는 계층적 구조를 가지며 관계형 데이터베이스는 계층적 데이터(외래 키 관계로 모델링된)에 대한 지원이 취약합니다. 문서 순서는 XML 인스턴스의 본질적인 속성이며 쿼리 결과에서 유지되어야 합니다. 이는 순서가 지정되지 않은 관계형 데이터와 다른 점이며 순서를 적용하기 위해서는 추가 순서 지정 열이 필요합니다. XML 데이터를 다수의 테이블로 분해하는 실제 XML 스키마의 경우 쿼리 도중에 결과를 재결합하는 것은 많은 비용이 필요합니다.

SQL Server 2005에는 XML이라고 부르는 네이티브 데이터 형식이 도입되었습니다. 사용자는 관계형 열 외에 XML 형식의 열을 하나 이상 가진 테이블을 만들 수 있습니다. 또한 XML 변수와 매개 변수도 허용됩니다. 문서 순서나 재귀적 구조와 같은 XML 모델 특징을 더 확실하게 지원하기 위해 XML 값은 대규모 이진 개체(BLOB)로 내부 형식에 저장됩니다.

SQL Server 2005는 W3C XML 스키마를 메타데이터로 관리하기 위한 방법으로 XML 스키마 컬렉션을 제공합니다. XML 데이터 형식을 XML 스키마 컬렉션과 연관시켜 XML 인스턴스에서 스키마 제약 조건을 적용할 수 있습니다. XML 데이터가 XML 스키마 컬렉션과 연관된 경우에는 형식있는 XML이라고 하고 그렇지 않은 경우에는 형식없는 XML이라고 합니다. 형식있는 XML과 형식없는 XML은 둘 다 단일 프레임워크 안에 포함되고 XML 데이터 모델이 유지되며 쿼리 처리는 XML 의미를 적용합니다. 이러한 목적을 위해 기본 관계형 인프라가 광범위하게 사용됩니다. 기본 관계형 인프라는 관계형 데이터와 XML 데이터 간에 상호 운용성을 지원하여 XML 기능이 더 널리 채택되도록 합니다.

XML 데이터 형식 쿼리 및 데이터 수정

XML 인스턴스는 T-SQL SELECT 문을 사용하여 검색할 수 있습니다. XML 인스턴스를 쿼리 및 수정하기 위해 XML 데이터 형식에 대한 5개의 메서드가 기본적으로 제공됩니다.

XML 데이터 형식 메서드에는 현재 최종 심의 단계에 있는 W3C 표준 언어 Xquery를 사용할 수 있으며 탐색 언어인 XPath 2.0이 포함되어 있습니다. 또한 하위 트리 추가 또는 삭제, 스칼라 값 업데이트 등과 같은 XML 데이터 수정을 위해 언어를 사용할 수 있습니다. 포함된 XQuery 및 데이터 수정 언어는 다양한 기능과 함께 사용되어 XML 데이터 조작을 위한 풍부한 지원을 제공합니다.

XQuery 형식 시스템은 W3C XML 스키마 형식 시스템과 연계됩니다. 대부분의 SQL 형식은 XQuery 형식 시스템과 호환됩니다(예: 10진수). 몇 가지 형식(예: xs:duration)은 내부 형식에 저장되며 XQuery 형식 시스템과 호환되도록 적절하게 해석됩니다.

컴파일 단계에서는 XQuery 식과 데이터 수정 문의 정적 형식 정확성을 검사하고 형식있는 XML 경우에 형식 참조를 위해 XML 스키마가 사용됩니다. 형식 안전 위반으로 인해 런타임에 식이 실패할 경우 정적 형식 오류가 발생합니다.

XML 인덱싱

쿼리 실행은 런타임에 각 XML 인스턴스를 처리합니다. XML 값의 크기가 크고 테이블에 있는 다수의 행에서 쿼리가 평가될 때마다 이 방법은 많은 비용이 듭니다. 결과적으로 쿼리 속도를 높이기 위해 XML 열을 인덱싱하는 메커니즘이 제공됩니다.

관계형 데이터를 인덱싱하기 위해 B+ 트리가 광범위하게 사용되어 왔습니다. XML 열의 기본 XML 인덱스는 열에 있는 XML 인스턴스의 모든 태그, 값 및 경로에서 B+ 트리 인덱스를 만듭니다. 이 방법을 통해 문서 순서와 문서 구조를 유지하면서 효율적으로 XML 데이터에 대한 쿼리를 평가하고 B+ 트리에서 XML 결과를 리어셈블할 수 있습니다.

일반적으로 발생하는 다른 클래스의 쿼리 실행 속도를 높이기 위해 XML 열에 보조 XML 인덱스를 만들 수 있습니다. 경로 기반 쿼리에 대한 PATH 인덱스, 속성 모음 시나리오에 대한 PROPERTY 인덱스, 값 기반 쿼리에 대한 VALUE 인덱스 등이 이러한 보조 XML 인덱스입니다.

XML 스키마 처리

서로 관련되거나( 사용) 관련되지 않을 수 있는 XML 스키마 컬렉션에 따라서 XML 열, 변수 및 매개 변수를 선택적으로 형식화할 수 있습니다. 형식있는 각 XML 인스턴스는 자신이 따르는 XML 스키마 컬렉션에서 대상 네임스페이스를 지정합니다. 데이터베이스 엔진은 데이터 할당 및 수정 도중에 XML 스키마에 따라 인스턴스의 유효성을 검사합니다.

XML 스키마 정보는 저장소 및 쿼리 최적화에 사용됩니다. 형식 있는 XML 인스턴스는 XML 인덱스에서와 같이 내부 이진 표현으로 형식 있는 값을 포함합니다. 따라서 형식 있는 XML 데이터를 효율적으로 처리할 수 있습니다.

관계형 및 XML 통합

사용자는 관계형 데이터와 XML 데이터를 동일한 데이터베이스에 저장할 수 있습니다. 간단하게 말해서 데이터베이스 엔진은 관계형 데이터 모델 외에 XML 데이터 모델을 적용하는 방법을 알고 있습니다. 관계형 데이터와 SQL 응용 프로그램은 SQL Server 2005로 업그레이드한 후에도 계속 정상적으로 작동합니다. 파일과 텍스트 또는 이미지 열에 상주하는 XML 데이터는 서버의 XML 데이터 형식 열로 이동할 수 있습니다. XML 데이터 형식 메서드를 사용하여 XML 열을 인덱싱, 쿼리 및 수정할 수 있습니다.

데이터베이스는 XML 처리를 위해 저장소 엔진 및 쿼리 프로세스와 같은 기존의 관계형 인프라 및 엔진 구성 요소를 사용합니다. 예를 들어 XML 인덱스가 B+트리를 만들고 실행 계획 출력에서 쿼리 계획을 볼 수 있습니다. 관계형 프레임워크에 통합되는 백업/복원 및 복제와 같은 데이터 관리 기능을 XML 데이터에서 사용할 수 있습니다. 마찬가지로 데이터 미러링 및 스냅샷 격리와 같은 새로운 데이터 관리 기능은 XML 데이터 형식과 함께 작동하여 완벽한 사용자 경험을 제공합니다.

구조적 데이터는 테이블 및 관계형 열에 저장되어야 합니다. 응용 프로그램에서 세밀하게 조정된 데이터의 쿼리와 수정을 수행해야 하는 경우 XML을 사용하는 반구조적 및 태그 데이터에는 XML 데이터 형식이 적합합니다.

FOR XML 및 OpenXML 향상

기존 FOR XML 기능은 여러 방법으로 향상되었습니다. 향상된 FOR XML 기능은 XML 데이터 형식 인스턴스 및 기타 새로운 SQL 형식(예: [n]varchar(max))에서 작동합니다. 향상된 FOR XML 기능에 대한 자세한 내용은 [4]에서 확인할 수 있습니다.

새로운 TYPE 지시문은 XML 데이터 형식 메서드를 사용하여 XML 열, 변수 또는 매개 변수에 할당하거나 쿼리할 수 있는 XML 데이터 형식 인스턴스를 생성합니다. 이 기능을 통해 SELECT ... FOR XML TYPE 문을 중첩할 수 있게 합니다.

PATH 모드는 열 값이 표시되어야 하는 XML 트리의 경로를 사용자가 지정할 수 있게 하며 앞서 언급한 중첩과 함께 FOR XML EXPLICIT보다 간편하게 작성할 수 있습니다.

ELEMENTS와 함께 사용되는 XSINIL 지시문은 xsi:nil="true" 특성을 가진 요소에 NULL을 매핑합니다. 또한 새로운 ROOT 지시문을 사용하면 모든 모드의 FOR XML에서 루트 노드를 지정할 수 있습니다. 새 XMLSCHEMA 지시문은 XSD 인라인 스키마를 생성합니다. 또한 SQL Server 2005의 FOR XML을 사용하면 FOR XML RAW 모드에서 기본 를 대체하기 위한 요소 이름을 지정할 수 있습니다.

향상된 OpenXML 기능은 sp_preparedocument에서 XML 데이터 형식을 허용하고 행 집합에서 XML 및 새 SQL 형식 열을 생성합니다.

XML 데이터 형식에 대한 클라이언트 액세스

클라이언트는 여러 방법으로 서버의 XML 데이터에 액세스할 수 있습니다. ODBC 및 OLE DB를 사용하는 네이티브 SQL 클라이언트 액세스는 XML 데이터 형식을 유니코드 문자열로 제공합니다. 또한 OLE DB는 유니코드 데이터를 스트리밍하기 위해 XML 데이터 형식에 대한 IsequentialStream 액세스를 제공합니다.

.NET Framework V2.0의 ADO.NET을 통해 관리되는 액세스는 SqlXml이라고 부르는 새 클래스로 XML 데이터를 제공합니다. 이 클래스는 반환된 XML을 읽기 위해 XmlReader 인스턴스를 반환하는 CreateReader()라는 메서드를 지원합니다. 마찬가지로 데이터 집합은 XML 문서로 편집하여 다시 SQL Server에 저장할 수 있는 중간 계층의 열에 XML 데이터 형식의 인스턴스를 로드할 수 있습니다. 두 가지 방법 중 하나로 SQL 쿼리를 서버에 대해 실행함으로써 중간 계층에서 조작하기 위해 XML 열을 검색할 수 있습니다.

SQL Server 2005에서 HTTP 종점에 대한 SOAP 직접 액세스를 사용하여 XML 데이터를 쿼리, 검색 및 수정할 수 있습니다.

네이티브 및 관리되는 클라이언트 기술은 모두 XML 열을 형식화하는 XML 스키마 컬렉션을 검색하기 위한 새로운 인터페이스를 제공합니다.

XML 저장소 사용을 가속화하는 시나리오

XML 데이터는 점점 더 널리 보급되고 있습니다. XML 데이터는 데이터를 설명하는 XML 스키마를 사용하거나 사용하지 않고서 고객 데이터를 표현할 수 있습니다. XML 데이터와 XML 스키마는 둘 다 함께 관리되야 합니다. 일반적으로 실제 응용 프로그램을 위한 XML 스키마는 복잡하게 되어 있으며 매핑(예: XML 스키마에서 테이블로의 매핑) 작업도 복잡하게 수행됩니다. 시간이 지나 XML 스키마가 변경되거나 시스템에 새 XML 스키마가 추가된 경우 이러한 매핑을 유지 관리하는 것은 매우 번거로운 일입니다. 흔히 XML 데이터는 파일 시스템이나 데이터베이스 서버의 텍스트 열에 저장됩니다. 텍스트 열은 복제 및 백업/복원과 같은 데이터 관리 측면에서 이점이 있지만 데이터의 XML 구조에 기반을 두는 쿼리 지원을 허용하지 않습니다. 네이티브 XML 지원을 통해 XML을 사용한 응용 프로그램 개발이 더욱 가속화되고 있습니다.

사용자 지정 속성 관리

사용자 인터페이스 소프트웨어와 같은 어떤 응용 프로그램에서는 고정된 속성 집합 중에서 선택할 수 있지만 어떤 응용 프로그램에서는 고유한 속성을 사용자가 정의할 수 있습니다. 이러한 사용자 지정 속성은 XML 형식으로 저장된 경우 제대로 관리할 수 있습니다. 다음과 같이 응용 프로그램은 스칼라 속성 이상을 지원할 수 있습니다.

  • 개체에 대한 다중 값 속성(예: 여러 전화 번호)을 지원할 수 있습니다.

  • 복잡한 속성을 지원할 수 있습니다. 예를 들어, 문서의 작성자 속성은 작성자의 연락처 정보가 될 수 있습니다.
    효율적인 쿼리 처리를 위해 개체 속성은 XML 데이터 형식 열에 저장되고 인덱싱될 수 있습니다.

데이터 교환 및 워크플로

XML은 플랫폼에 독립적인 방법으로 응용 프로그램 간에 데이터를 교환할 수 있게 합니다. 이러한 데이터는 XML 태그를 사용하여 메시지로 모델링할 수 있습니다. XML 메시지를 지속적으로 분산 및 생성하는 대신에 메시지를 XML 형식으로 저장하는 것이 신중한 방법입니다. 이 방법은 데이터 흐름 요구 사항에 적합합니다. 워크플로 단계에 도달한 XML 메시지는 현재 상태를 유지합니다. 각 메시지가 처리되고 진행률이 XML 콘텐츠(예: 상태 변경)에 기록되며 XML 데이터가 워크플로 처리의 다음 단계로 전달됩니다. 메시지는 형식이 다르거나 반구조적일 수 있으며 다른 XML 스키마가 연관되었을 수 있으므로 메시지를 테이블로 매핑하는 것은 항상 쉬운 작업이 아닙니다.

재무 데이터나 지리 정보 데이터와 같은 다양한 분야를 위한 XML 기반 표준이 등장하고 있습니다. 이러한 표준은 쿼리 및 업데이트할 수 있는 인스턴스 데이터에 기초하여 데이터 구조를 설명합니다. 흔히 실제 데이터는 이진 형태이지만 XML 데이터는 실제 데이터에 대한 메타데이터 정보를 제공합니다.

간단한 예로, 입력 매개 변수 테이블을 저장 프로시저 또는 함수에 전달하기 위해 응용 프로그램은 데이터를 XML로 변환하고 XML 데이터 형식 매개 변수로 전달합니다. 저장 프로시저 또는 함수 내에서 행 집합은 XML 매개 변수로부터 다시 생성됩니다.

문서 관리

콜 센터에서 환자 레코드와 대화 내용을 XML 문서로 유지 관리한다고 가정해 보십시오. 환자가 전화를 걸어오면 콜 센터는 이전의 대화 내용을 불러와 걸려온 전화의 컨텍스트를 설정해야 합니다. XML 태그를 쿼리하여 이러한 작업을 수행할 수 있으며 이 방법은 응용 프로그램에 이점을 제공합니다. 또한 이전 대화 내용의 세부 정보를 검색하고 현재 대화 내용을 기록하는 작업을 더 쉽게 수행할 수 있습니다.

전자 메일과 같은 문서는 기본적으로 반구조적입니다. XML 태그가 포함된 문서는 Office 2003과 같은 도구를 사용하여 작성하는 일이 점점 더 간편해지고 있습니다. 이러한 XML 문서는 XML 열에 저장하고 인덱싱, 쿼리 및 업데이트할 수 있습니다. 따라서 개발자는 네이티브 XML 지원을 사용하여 더 많은 것을 할 수 있습니다.

SQL Server 2005의 서버 쪽 XML 처리

SQL Server 2005에서는 관계형 데이터와 XML 데이터를 저장할 수 있는 하나의 데이터베이스를 제공하는 지원 방법이 사용됩니다.

XML 데이터 형식

유용한 CREATE TABLE 문을 사용하여 XML 열이 있는 테이블을 만들 수 있습니다. 그런 다음 특수한 방법으로 XML 열을 인덱싱할 수 있습니다.

형식없는 XML

SQL Server 2005 XML 데이터 형식은 ISO SQL-2003 표준 XML 데이터 형식을 구현합니다. 따라서 올바른 형식의 XML 1.0 문서뿐만 아니라 텍스트 노드와 임의 개수의 최상위 요소가 포함된 소위 XML 콘텐츠 단편도 저장할 수 있습니다. 데이터가 올바른 형식을 가지는지 검사되며(XML 데이터 형식이 XML 스키마에 바인딩될 필요는 없음) 올바른 형식이 아닌 데이터는 거부됩니다.

스키마가 미리 알려지지 않아서 매핑 기반 솔루션이 불가능한 경우에 형식없는 XML이 유용합니다. 또한 스키마가 알려져 있지만 관계형 데이터로의 매핑 모델이 매우 복잡하고 유지 관리하기 힘들거나 여러 스키마가 존재하며 외부 요구 사항에 기초하여 이러한 스키마가 나중에 데이터에 바인딩될 경우에도 형식없는 XML이 유용합니다.

예제: 테이블의 형식없는 XML 열

다음 문은 정수 기본 키 "pk" 와 형식없는 XML 열 "xCol"을 사용하여 "docs"라는 테이블을 만듭니다.

CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)

또한 기본 키가 있거나 없는 둘 이상의 XML 또는 관계형 열을 사용하여 테이블을 만들 수 있습니다.

형식있는 XML

XML 스키마 컬렉션에 XML 데이터를 설명하는 XML 스키마가 있을 경우 XML 스키마 컬렉션을 XML 열과 연관시켜 형식있는 XML을 생성할 수 있습니다. XML 스키마는 데이터의 유효성을 검사하고 쿼리 및 데이터 수정 문의 컴파일 도중에 형식없는 XML보다 정확한 형식 검사를 수행하며 저장소 및 쿼리 처리를 최적화하는 데 사용됩니다.

형식있는 XML 열, 매개 변수 및 변수는 선언 시에 옵션으로 지정할 수 있는 XML 문서나 콘텐츠를 저장할 수 있습니다(각각 DOCUMENT 또는 CONTENT 옵션으로 지정할 수 있으며 기본값은 CONTENT). 또한 XML 스키마 컬렉션을 제공해야 합니다. 각 XML 인스턴스에 정확하게 하나의 최상위 요소가 있을 경우 DOCUMENT를 지정하고 그렇지 않을 경우에는 CONTENT를 사용합니다. 쿼리 컴파일러는 형식 검사에서 DOCUMENT 플래그를 사용하여 싱글톤(singleton) 최상위 요소를 유추합니다.

예제: 테이블의 형식있는 XML 열

XML 열, 변수 및 매개 변수는 XML 스키마 컬렉션에 바인딩될 수 있습니다(자세한 내용과 예제는 이 기사의 뒤에 나오는 "XML 스키마 처리" 절 참조). MyCollection이 이러한 컬렉션 중 하나의 이름이라고 가정해 보십시오. 아래 문은 myCollection을 사용하여 형식화된 XML 열 Document가 있는 XmlCatalog 테이블을 만듭니다. 또한 단순히 XML 문서가 아니라 XML 단편을 허용하기 위해 형식있는 XML 열이 지정됩니다.

CREATE TABLE XmlCatalog (
ID INT PRIMARY KEY,
Document XML(CONTENT myCollection))

XML 데이터 형식 열 제약

  • XML 열을 형식화하는 것 외에도 형식 있는/없는 XML 데이터 형식 열에서 관계형(열 또는 행) 제약 조건을 사용할 수 있습니다. 대부분의 SQL 제약 조건은 XML 열에도 적용할 수 있지만 XML 데이터 형식 인스턴스는 비교할 수 없기 때문에 UNIQUE, PRIMARY KEY 및 FOREIGN KEY 제약 조건은 예외입니다. 따라서 XML 열을 널을 허용하거나 허용하지 않도록 지정하고 기본 값을 제공하며 열에서 CHECK 제약 조건을 정의할 수 있습니다. 예를 들어, 형식없는 XML 열은 저장된 XML 인스턴스가 XML 스키마를 따른다는 것을 확인하기 위해 CHECK 제약 조건을 가질 수 있습니다.
다음 상황에서 제약 조건을 사용합니다.
  • 비즈니스 규칙을 XML 스키마로 표현할 수 없습니다. 예를 들어, 꽃 가게의 배송 주소는 가게 위치로부터 50마일 이내에 있어야 하는데 이것을 XML 열에서 제약 조건으로 작성할 수 있습니다. 이 제약 조건은 XML 데이터 형식 메서드를 포함할 수 있습니다.

  • 테이블의 다른 XML 열이나 비 XML 열이 제약 조건에 포함됩니다. XML 인스턴스에 있는 고객의 ID(/Customer/@CustId)를 적용하여 정수 CustomerID 열의 값을 일치시키는 것을 예로 들 수 있습니다.

예제: XML 열 제약

CREATE FUNCTION udf_Check_Names (@xmlData XML)
RETURNS int AS
BEGIN
RETURN (SELECT @xmlData.exist(''/book/author[first-name = last-name]''))
END
GO

CREATE TABLE docs (pk INT PRIMARY KEY,
xCol XML not null
CONSTRAINT CK_name CHECK (udf_Check_Names(xCol) = 0))
GO

텍스트 인코딩

SQL Server 2005는 XML 데이터를 유니코드(UTF-16)로 저장합니다. 또한 서버에서 검색된 XML 데이터는 UTF-16 인코딩으로 제공됩니다. 다른 인코딩을 원할 경우 데이터를 검색한 후에 캐스팅을 통해 또는 중간 계층에서 필요한 변환을 수행해야 합니다. 예를 들어, XML 데이터를 서버에서 varchar 형식으로 캐스팅할 수 있는데 이 경우에 데이터베이스 엔진은 varchar의 데이터 정렬에서 결정된 인코딩으로 XML을 직렬화합니다.

XML 데이터 저장

XML 열, 매개 변수 또는 변수에 대한 XML 값을 다음과 같은 여러 방법으로 제공할 수 있습니다.

  • XML 데이터 형식으로 암시적으로 변환되는 문자 또는 이진 SQL 형식으로

  • 파일 콘텐츠로

  • XML 데이터 형식 인스턴스를 생성하는 TYPE 지시문이 포함된 XML 게시 메커니즘 FOR XML의 출력으로
제공된 값은 형식이 올바른지 검사되며 XML 문서와 XML 단편을 모두 저장하는 것이 허용됩니다. 형식이 올바른지 않은 경우 해당 오류 메시지와 함께 데이터는 거부됩니다.

형식있는 XML의 경우 XML 열을 형식화하는 XML 스키마 컬렉션에 등록된 XML 스키마를 따르는지 여부를 제공된 값에서 검사합니다. 이 유효성 검사에 실패할 경우 XML 인스턴스는 거부됩니다. 또한 CONTENT에서 XML 문서와 콘텐츠를 모두 제공하도록 허용하는 것과 달리 형식있는 XML의 DOCUMENT 플래그에서는 허용되는 값이 XML 문서로 제한됩니다.

예제: 형식없는 XML 열에 데이터 삽입

다음 문은 정수 열 pk에 대한 값 1과 XML 열에 대한 인스턴스와 함께 테이블 docs에 새 행을 삽입합니다. 문자열로 제공되는 데이터는 XML 데이터 형식으로 암시적으로 변환되며 삽입 도중에 형식이 올바른지 검사됩니다.

INSERT INTO docs VALUES (1,
''


Michael
Howard


David
LeBlanc

39.99
'')
INSERT INTO docs VALUES (2,
''





'')

예제: 파일에서 형식없는 XML 열에 데이터 삽입

아래 나온 INSERT 문은 OPENROWSET을 사용하여 C:\temp\xmlfile.xml 파일의 내용을 BLOB로 읽습니다. 기본 키에 대한 값 10과 XML 열 xCol에 대한 BLOB와 함께 테이블 docs에 새 행이 삽입됩니다. 파일 내용이 XML 열에 할당될 때 형식이 올바른지 검사됩니다.

INSERT INTO docs
SELECT 10, xCol
FROM (SELECT * FROM OPENROWSET
(BULK ''C:\temp\xmlfile.xml'',
SINGLE_BLOB) AS xCol) AS R(xCol)

예제: 형식있는 XML 열에 데이터 삽입

형식있는 XML 열에서는 형식화하는 데 사용되는 XML 스키마의 대상 네임스페이스(빈 네임스페이스 가능)를 지정하기 위해 XML 인스턴스 데이터가 필요합니다. 이를 위해서 아래 예제에서는 네임스페이스 선언 xmlns=http://myDVD가 사용됩니다.

INSERT XmlCatalog VALUES(2,
''<?xml version="1.0"?>



19.99

'')

예제: TYPE 지시문과 함께 FOR XML을 사용하여 생성한 XML 데이터 저장

결과를 XML 데이터 형식 인스턴스로 생성하기 위해 TYPE 지시문을 사용하도록 FOR XML이 향상되었습니다. 결과 XML을 XML 열, 변수 또는 매개 변수에 할당할 수 있습니다. 다음 문에서 FOR XML TYPE을 사용하여 생성된 XML 인스턴스는 XML 데이터 형식 변수 @xVar에 할당됩니다. XML 데이터 형식 메서드를 사용하여 변수를 쿼리할 수 있습니다.

DECLARE @xVar XML
SET @xVar = (SELECT * FROM docs FOR XML AUTO,TYPE)

저장소 표현

XML 데이터 형식 인스턴스는 스트리밍 가능하며 효율적 구문 분석을 위해 최적화된 내부 이진 표현에 저장됩니다. 태그는 정수 값에 매핑되며 매핑된 값은 내부 표현에 저장됩니다. 이 과정에서 데이터가 일부 압축되기도 합니다.

형식없는 XML의 경우 노드 값은 유니코드(UTF-16) 문자열로 저장되므로 작업을 수행하려면 런타임 형식 변환이 필요합니다. 예를 들어, 조건자 /book/price > 9.99를 평가하려면 책 가격의 값은 10진수로 변환되어야 합니다. 반면, 형식있는 XML의 경우 값은 XML 스키마에 지정된 형식으로 인코딩됩니다. 따라서 데이터 구문 분석이 훨씬 더 효율적으로 수행되며 런타임 변환이 방지됩니다.

저장된 이진 형식은 각 XML 인스턴스마다 2GB로 제한되며 이것은 대부분의 XML 데이터를 수용할 수 있는 크기입니다. 또한 XML 계층의 깊이는 128개 수준으로 제한됩니다.

XML 데이터의 InfoSet (영문) 콘텐츠는 유지됩니다. 중요하지 않은 공백, 특성 순서, 네임스페이스 접두사, XML 선언 등과 같은 정보가 유지되지 않기 때문에 텍스트 XML과 다를 수 있습니다.

데이터 모델링 고려 사항

일반적으로 데이터 모델링에는 관계형 및 XML 데이터 형식 열의 조합이 적합합니다. XML 데이터의 일부 값은 관계형 열에 저장될 수 있으며 나머지 또는 전체 XML 값은 XML 열에 저장될 수 있습니다. 이렇게 하면 성능과 잠금 특성이 향상될 수 있습니다.

XML 데이터 내의 값은 동일한 테이블의 싱글톤(singleton) 값(즉, 단일 값 속성)에 대해 계산된 열로 승격될 수 있습니다. 다중 값 속성은 속성에 대한 별개의 테이블이 필요하며 이러한 테이블은 트리거를 사용하여 채우고 유지 관리해야 합니다. 또한 속성 테이블에 대해 쿼리를 직접 작성해야 합니다.

XML 열에 저장된 XML 데이터의 입도(granularity)는 잠금 및 업데이트 특성에 중요합니다. SQL Server는 XML 및 비 XML 데이터 모두에 대해 동일한 잠금 메커니즘을 사용합니다. 입도(granularity)가 클 경우 업데이트를 위해 큰 XML 인스턴스를 잠그면 다수의 사용자가 있는 상황에서 처리 속도가 저하됩니다. 반대로 너무 심하게 분해된 경우에는 개체 캡슐화가 손실되고 리어셈블리 비용이 발생합니다.

XML 데이터 쿼리 및 수정

XML 열에 저장된 XML 인스턴스를 쿼리하려면 열의 이진 XML 데이터를 구문 분석하는 것이 필요합니다. 이진 XML을 구문 분석하는 것은 텍스트 형식의 XML 데이터를 구문 분석하는 것보다 훨씬 빠릅니다. XML 인덱싱은 재분석을 방지하며 "XML 데이터 인덱싱" 절에 설명되어 있습니다.

XML 데이터 형식에 대한 메서드

필요에 따라 전체 XML 값을 검색하거나 XML 인스턴스의 일부를 검색할 수 있습니다. XQuery 식을 인수로 가지는 네 개의 XML 데이터 형식 메서드인 query(), value(), exist() 및 nodes()를 사용하여 이 작업을 수행할 수 있습니다. 또 다른 메서드인 modify()에서는 XML 데이터 수정 문을 입력으로 사용하여 XML 데이터를 수정할 수 있습니다.

query() 메서드는 XML 인스턴스의 일부를 추출하는 데 사용됩니다. XQuery 식은 XML 노드 목록으로 평가됩니다. 이러한 각 노드에서 시작하는 하위 트리는 문서 순서로 반환됩니다. 결과 형식은 형식없는 XML입니다.

value() 메서드는 XML 인스턴스에서 스칼라 값을 추출합니다. 이 메서드는 XQuery 식이 평가되는 노드의 값을 반환합니다. 이 값은 value() 메서드의 두 번째 인수로 지정된 T-SQL 형식으로 변환됩니다.

exist() 메서드는 XML 인스턴스에 대한 실존적 검사를 수행하는 데 사용됩니다. 이 메서드는 XQuery 식이 null이 아닌 노드 목록으로 평가될 경우 1을 반환하고 그렇지 않을 경우 0을 반환합니다.

nodes() 메서드는 특수한 XML 데이터 형식의 인스턴스를 생성하며 각 인스턴스는 XQuery 식이 평가되는 다른 노드로 설정된 컨텍스트를 가집니다. 특수한 XML 데이터 형식은 query(), value(), nodes() 및 exist() 메서드를 지원하며 count(*) 집계와 NULL 검사에 사용될 수 있습니다. 다른 용도로 사용하면 오류가 발생합니다.

modify() 메서드는 XML 인스턴스의 일부를 수정하는 데 사용됩니다. 예를 들어, 하위 트리를 추가 또는 삭제하거나 책 가격과 같은 스칼라 값을 9.99에서 39.99로 바꿀 수 있습니다.

예제: query() 메서드 사용

id가 123인 요소 아래의 임의 위치에서

요소를 추출하는 다음 쿼리가 테이블 docs의 XML 열 xCol에 있습니다. 또한 이 쿼리는 정수 기본 키 열에서 값을 검색합니다. SELECT 목록의 query() 메서드는 일련의
요소를 생성하는 테이블의 각 행에 대해 평가되며 이러한 요소는 해당 하위 트리와 함께 문서 순서로 검색됩니다. id가 123인 요소가 없거나
요소가 없는 각 XML 인스턴스는 결과를 반환하지 않습니다. 즉, 이 경우 query() 메서드의 반환 값은 빈 XML입니다.

SELECT pk, xCol.query(''/doc[@id = 123]//section'')
FROM docs

빈 XML 값은 외부 SELECT 문에서 필터링할 수 있습니다. 또는 다음 예제에 나온 것처럼 exist() 메서드를 사용할 수 있습니다.

예제: exist() 메서드 사용

아래 쿼리는 테이블 docs의 XML 열 xCol에 있는 query() 및 exist() 메서드를 포함합니다. exist() 메서드는 값이 123인 id라고 부르는 특성을 가진 최상위 요소가 존재하는지 검사하는 경로 식 /doc[@id = 123]을 평가합니다. 이러한 각 행에 대해 SELECT 절의 query() 메서드가 평가됩니다. 이 예제에서 query() 메서드는 요소 아래의 임의 위치에 일련의

요소를 생성합니다. exist() 메서드에서 0을 반환하는 모든 행은 건너뜁니다.

SELECT xCol.query(''/doc[@id = 123]//section'')
FROM docs
WHERE xCol.exist (''/doc[@id = 123]'') = 1

예제: value() 메서드 사용

다음 쿼리는 value() 메서드를 사용하여 문서의 세 번째 섹션 제목을 유니코드 문자열로 추출합니다. 결과의 SQL 형식 nvarchar(max)는 value() 메서드의 두 번째 인수로 지정됩니다. XQuery 함수 data()는


after (/doc/section[@num=1])[1]'')

예제: 책 가격을 $49.99로 업데이트

다음 업데이트 문은 ISBN이 1-8610-0311-0인 책의 를 $49.99로 바꿉니다. XML 인스턴스는 XML 데이터 수정 문의 네임스페이스 선언인 XML 스키마 http://myBooks로 형식화됩니다.

UPDATE XmlCatalog
SET Document.modify (''
declare namespace bk = "http://myBooks";
replace value of (/bk:bookstore/bk:book
[@ISBN="1-861003-11-0"]/bk:price)[1] with 49.99'')

형식 검사 및 정적 오류

XQuery에서는 형식 검사가 수행됩니다. 컴파일 단계에서 XQuery 식과 데이터 수정 문의 정적 형식 정확성이 검사되며 형식있는 XML의 경우 형식 유추를 위해 XML 스키마가 사용됩니다. 형식 안전 위반으로 런타임에 식이 실패할 경우 정적 형식 오류가 발생합니다. 정적 오류의 예로는 문자열을 정수에 추가하거나 단일 값이 필요한 작업에서 값 시퀀스를 수신하거나 존재하지 않는 노드에서 형식있는 데이터를 쿼리하는 경우 등이 있습니다. 형식 불일치로 인한 정적 오류를 해결하는 방법은 적절한 형식으로 명시적 캐스팅을 수행하는 것입니다. 그러면 XQuery 런타임 오류가 빈 시퀀스로 변환됩니다.

런타임에 싱글톤(singleton)이 보장되는지 여부를 컴파일러에서 확인할 수 없는 경우 싱글톤(singleton)이 필요한 위치 단계, 함수 매개 변수 및 연산자(예: eq)는 오류를 반환합니다. 형식없는 데이터의 경우 문제가 자주 발생합니다. 예를 들어, 특성 조회에는 싱글톤(singleton) 부모 요소가 필요하며 단일 부모 노드를 선택하는 서수가 적합합니다.

예제: value() 메서드의 형식 검사

형식없는 XML 열에 대한 아래 쿼리에서는 싱글톤(singleton) 노드가 첫 번째 인수로 value() 메서드에 사용되기 때문에 //author/last-name에 서수 지정이 필요합니다. 이 값이 없을 경우 컴파일러는 런타임에 노드가 하나만 발생하는지 여부를 확인할 수 없습니다.

SELECT xCol.value(''(//author/last-name)[1]'', ''nvarchar(50)'') LastName
FROM docs

다음 예제에 나온 것처럼 node()-value() 조합을 평가하여 특성 값을 추출하는 경우에는 서수 지정이 필요하지 않을 수 있습니다.

예제: 알려진 싱글톤(singleton)

아래 나온 nodes() 메서드는 각 요소에 대한 별개의 행을 생성합니다. 노드에서 평가되는 value() 메서드는 특성이 되는 싱글톤(singleton)인 @genre의 값을 추출합니다.

SELECT nref.value(''@genre'', ''varchar(max)'') LastName
FROM docs CROSS APPLY xCol.nodes(''//book'') AS R(nref)

도메인 간의 데이터 바인딩

관계형 및 XML 데이터 형식 열의 조합에 데이터가 상주할 경우 관계형 및 XML 데이터 처리를 결합하는 쿼리를 작성하는 것이 필요할 수 있습니다. TYPE 지시문과 함께 FOR XML을 사용하여 관계형 및 XML 열의 데이터를 XML 데이터 형식 인스턴스로 변환하고 XQuery를 사용하여 쿼리할 수 있습니다. 반대로 아래의 "XML 데이터에서 행 집합 생성" 절에 나온 것처럼 XML 값에서 행 집합을 생성하고 T-SQL을 사용하여 쿼리할 수 있습니다.

교차 도메인 쿼리를 작성하는 데 쉽고 효율적인 방법은 XQuery 또는 XML 데이터 수정 식 내에서 SQL 변수나 열의 값을 사용하는 것입니다.

  • sql:variable()을 사용하여 XQuery 또는 XML DML 식에서 SQL 변수 값을 적용합니다.

  • sql:column()을 사용하여 XQuery 또는 XML DML 컨텍스트에서 관계형 열의 값을 사용합니다.

이 접근 방법을 사용하면 아래 예제에 나온 것처럼 응용 프로그램에서 쿼리를 매개 변수화할 수 있습니다. Sql:column()은 비슷한 방식으로 사용되지만 더 많은 이점을 제공합니다. 비용 기반 쿼리 최적화 프로그램에서 결정하는 것처럼 효율성을 확보하기 위해 열에서 인덱스를 사용할 수 있습니다. 또한 계산된 열을 사용할 수도 있습니다.

XML 및 사용자 정의 형식은 sql:variable() 및 sql:column()에서 사용하는 것이 허용되지 않습니다.

예제: sql:variable()을 사용하는 교차 도메인 쿼리

이 쿼리에서는 SQL 변수 @isbn을 사용하여 요소의 ISBN이 전달됩니다. 상수를 사용하는 대신에 sql:variable()은 ISBN 값을 제공하며 쿼리를 사용하여 단순히 ISBN이 0-7356-1588-2인 경우가 아니라 모든 ISBN을 검색할 수 있습니다.

DECLARE @isbn varchar(20)
SET @isbn = ''0-7356-1588-2''
SELECT xCol
FROM??/ ??? ????.?@???y ? ? ??book[@ISBN = sql:variable("@isbn")]'') = 1

XML 데이터에서 행 집합 생성

사용자 지정 속성 관리 및 데이터 교환 시나리오에서 대개 응용 프로그램은 XML 데이터의 일부분을 행 집합에 매핑합니다. 예를 들어, 입력 매개 변수 테이블을 저장 프로시저나 함수에 전달하기 위해 응용 프로그램은 데이터를 XML로 변환하고 XML 데이터 형식 매개 변수로 전달합니다. 저장 프로시저 또는 함수 내에서 행 집합은 XML 매개 변수에서 다시 생성됩니다.

SQL Server 2000은 이 목적을 위해 OpenXml()을 제공합니다. 이 메서드는 행 집합에 대한 관계형 스키마를 지정하고 XML 인스턴스 내의 값이 행 집합의 열에 매핑되는 방법을 지정하여 XML 인스턴스에서 행 집합을 생성합니다.

또는 nodes() 메서드를 사용하여 XML 인스턴스 내에 노드 컨텍스트를 생성할 수 있으며 value(), query(), exist() 및 nodes() 메서드에서 노드 컨텍스트를 사용하여 원하는 행 집합을 생성할 수 있습니다. nodes() 메서드는 제공된 XQuery 식을 XML 열의 각 XML 인스턴스에서 평가하고 XML 인덱스를 효과적으로 사용합니다. 다음 예제는 행 집합 생성을 위해 nodes() 메서드를 사용하는 방법을 보여 줍니다.

예제: XML 인스턴스에서 속성 추출

이름이 "David"인 저자의 이름과 성을 두 개의 열(FirstName 및 LastName)로 구성된 행 집합으로 추출해야 한다고 가정해 보십시오. 다음과 같이 nodes() 및 value() 메서드를 사용하여 이 작업을 수행할 수 있습니다.

SELECT nref.value(''first-name[1]'', ''nvarchar(50)'') FirstName,
nref.value(''last-name[1]'', ''nvarchar(50)'') LastName
FROM docs CROSS APPLY xCol.nodes(''//author'') AS R(nref)
WHERE nref.exist(''.[first-name != "David"]'') = 1

이 예제에서 nodes(''//author'')는 각 XML 인스턴스의 요소에 대한 참조 행 집합을 생성합니다. 저자의 이름과 성은 이러한 참조를 기준으로 value() 메서드를 평가하는 방법을 통해 가져옵니다. 다음 절에서 설명된 것처럼 우수한 성능을 위해 XML 열을 인덱싱해야 합니다.

예제: XML 변수에서 속성 추출

XML 변수나 매개 변수에서 속성을 추출할 경우 위 쿼리의 CROSS APPLY 연산자가 필요하지 않습니다. 다음 예제에서는 인스턴스가 할당되는 XML 변수 @xVar를 고려하고 저자의 을 검색합니다.

DECLARE @xVar XML
SET @xVar =
''


Michael
Howard


David
LeBlanc

39.99
''

SELECT nref.value(''first-name[1]'', ''nvarchar(50)'') FirstName,
nref.value(''last-name[1]'', ''nvarchar(50)'') LastName
FROM @xVar.nodes(''//author'') AS R(nref)
WHERE nref.exist(''.[first-name != "David"]'') = 1

XML 데이터 인덱싱

XML 데이터는 내부 이진 형식으로 저장되며 최대 저장 크기는 2GB가 될 수 있습니다. 각 쿼리는 테이블의 각 행에서 XML BLOB을 런타임에 한 번 이상 구문 분석합니다. 이로 인해서 쿼리 처리 속도가 느려집니다. 데이터 수정 도중에 XML 인덱스 유지 관리를 위한 비용을 고려해야 하지만 쿼리가 작업 부하에서 일반적으로 수행되는 경우에는 XML 열을 인덱싱하는 것이 유리합니다.

형식 있는/없는 XML 열에서 새로운 DDL 문을 사용하여 XML 인덱스를 만듭니다. 이렇게 하면 열의 모든 XML 인스턴스에 대해 B+ 트리가 만들어집니다. XML 열의 첫 번째 인덱스는 "기본 XML 인덱스"입니다. 다음 절에서 설명된 것처럼 이 인덱스를 사용하여 XML 열에서 세 가지 유형의 보조 XML 인덱스가 지원되며 공통된 쿼리 클래스의 속도가 향상됩니다.

기본 XML 인덱스

기본 XML 인덱스는 기본 테이블(즉, XML 열이 정의된 테이블)의 기본 키에서 클러스터된 인덱스가 필요합니다. 이 인덱스는 XML 노드의 Infoset 항목 하위 집합에서 B+ 트리를 만듭니다. B+ 트리의 열은 요소 및 속성 이름, 노드 값, 노드 유형 등과 같은 태그를 나타냅니다. 다른 열은 경로 식의 효율적인 평가를 위해서 XML 데이터의 문서 순서와 구조를 캡처하고 XML 인스턴스 루트에서 각 노드까지의 경로를 캡처합니다. 인덱스 행을 기본 테이블 행과 상관시키기 위해 기본 테이블의 기본 키는 기본 XML 인덱스에 복제됩니다.

XML 스키마에 제공된 태그 및 형식 이름은 정수 값에 매핑되며 저장소를 최적화하기 위해 매핑된 값은 B+ 트리에 저장됩니다. 인덱스의 경로 열은 매핑된 값의 연결을 역순으로 저장합니다(즉, 노드에서 XML 인스턴스의 루트까지의 경로). 역순 표현을 사용하면 경로 접미사가 알려진 경우(//author/last-name과 같은 경로 식에서) 경로 값을 일치시킬 수 있습니다.

기본 테이블이 분할된 경우 기본 XML 인덱스는 동일한 방법으로, 즉 동일한 분할 함수와 분할 스키마를 사용하여 분할됩니다.

전체 XML 인스턴스는 XML 열(SELECT * FROM docs 또는 SELECT xCol FROM docs)에서 검색됩니다. XML 데이터 형식 메서드를 포함하는 쿼리는 기본 XML 인덱스를 사용하여 인덱스 자체에서 스칼라 값이나 XML 하위 트리를 반환합니다.

예제: 기본 XML 인덱스 만들기

다음 문은 테이블 docs의 XML 열 xCol에 idx_xCol이라는 XML 인덱스를 만듭니다.

CREATE PRIMARY XML INDEX idx_xCol on docs (xCol)

보조 XML 인덱스

기본 XML 인덱스가 만들어진 후에는 보조 XML 인덱스를 만들어 작업 부하 내에서 다른 클래스의 쿼리가 실행되는 속도를 향상시킬 수 있습니다. 세 가지 유형의 보조 XML 인덱스인 PATH, PROPERTY 및 VALUE가 있으며 이러한 인덱스는 각각 경로 기반 쿼리, 사용자 지정 속성 관리 시나리오 및 값 기반 쿼리에 유용합니다.

최대 128개 수준의 XML 계층이 허용되며 더 긴 경로를 포함하는 XML 인스턴스는 삽입 및 수정 도중에 거부됩니다.

마찬가지로 노드 값의 처음 128바이트까지만 인덱싱됩니다. 더 긴 값이 시스템에서 허용되기는 하지만 인덱싱되지는 않습니다.

예제: 경로 기반 조회

작업 부하에서 다음 쿼리가 일반적으로 수행된다고 가정해 보십시오.

SELECT xCol
FROM docs
WHERE xCol.exist (''/book[@genre = "security"]'') = 1

경로 식 /book/@genre 및 값 "security"는 PATH 인덱스의 키 필드에 해당합니다. 결과적으로 형식 PATH의 보조 XML 인덱스는 이 작업 부하에 도움이 됩니다.

CREATE XML INDEX idx_xCol_Path on docs (xCol)
USING XML INDEX idx_xCol FOR PATH

예제: 개체의 속성 반입

테이블 T의 각 행에서 책의 "genre", "title" 및 ISBN 속성을 검색하는 다음과 같은 쿼리가 있습니다.

SELECT xCol.value (''(/book/@genre)[1]'', ''varchar(50)''),
xCol.value (''(/book/title)[1]'', ''varchar(50)''),
xCol.value (''(/book/@ISBN)[1]'', ''varchar(50)'')
FROM docs

이 경우에 속성 인덱스가 유용하며 다음과 같이 작성됩니다.

CREATE XML INDEX idx_xCol_Property on docs (xCol)
USING XML INDEX idx_xCol FOR PROPERTY

예제: 값 기반 쿼리

다음 쿼리에서 하위 축(// 연산자)이 부분 경로를 지정하므로 ISBN 값에 기초하는 조회에는 VALUE 인덱스가 유용합니다.

SELECT xCol
FROM docs
WHERE xCol.exist (''//book/@ISBN[. = "0-7356-1588-2"]'') = 1

VALUE 인덱스는 다음과 같이 만들어집니다.

CREATE XML INDEX idx_xCol_Value on docs (xCol)
USING XML INDEX idx_xCol FOR VALUE

콘텐츠 인덱싱

XML 열에서 전체 텍스트 인덱스를 만들 수 있습니다. 이렇게 하면 XML 태그를 무시하면서 XML 값의 내용이 인덱싱됩니다. 특성 값은 전체 텍스트 인덱싱되지 않으며(태그의 일부로 간주되므로) 요소 태그는 토큰 경계로 사용됩니다. XML 열에서 XML 및 전체 텍스트 인덱스를 모두 만들어 전체 텍스트 검색을 XML 인덱스 사용과 결합할 수 있습니다. 전체 텍스트 인덱스를 첫 번째 필터로 사용하여 선택 항목의 범위를 좁힌 다음 XQuery를 적용하여 추가로 필터링합니다.

CONTAINS() 및 XQuery contains()를 사용한 전체 텍스트 검색은 다른 의미를 가집니다. 전자가 형태소 분석을 사용한 토큰 일치인 것에 반하여 후자는 하위 문자열 일치입니다.

예제: XML 열에서 전체 텍스트 인덱스 만들기

XML 열에서 전체 텍스트 인덱스를 만들기 위한 단계는 다른 SQL 형식 열에서 사용되는 단계와 동일합니다. 기본 테이블의 고유한 키 열이 필요합니다. DDL 문은 다음과 같고 여기서 PK__docs__7F60ED59는 테이블의 단일 열 기본 키 인덱스입니다.

CREATE FULLTEXT CATALOG ft AS DEFAULT
CREATE FULLTEXT INDEX ON dbo.docs (xCol) KEY INDEX PK__docs__7F60ED59

예제: 전체 텍스트 검색을 XML 쿼리와 결합

다음 쿼리는 XML 값이 책 제목에 "Secure" 단어를 포함하는지 검사합니다.

SELECT *
FROM docs
WHERE CONTAINS(xCol,''Secure'')
AND xCol.exist(''/book/title/text()[contains(.,"Secure")]'') =1

CONTAINS() 메서드는 전체 텍스트 인덱스를 사용하여 문서의 임의 위치에 "Secure" 단어가 포함된 XML 값을 하위 집합으로 만듭니다. exist() 절은 "Secure" 단어가 책 제목에 있는지 확인합니다.

XML 인덱스를 사용한 쿼리 실행

XML 인덱스는 쿼리 실행 속도를 향상시킵니다. 쿼리는 항상 XML 열의 기본 XML 인덱스(있을 경우)에 대해 컴파일됩니다. 전체 쿼리(관계형 및 XML 부분 모두 포함)에 대해 단일 쿼리 계획이 생성되며 이 계획은 데이터베이스 엔진의 비용 기반 최적화 프로그램을 사용하여 최적화됩니다. 보조 XML 인덱스는 쿼리 최적화 프로그램의 비용 예측에 따라 선택됩니다.

XML 인덱스의 카탈로그 뷰

XML 인덱스에 대한 메터데이터 정보를 제공하기 위해 카탈로그 뷰가 존재합니다. 카탈로그 뷰 sys.indexes에는 인덱스 "type" 3을 가진 XML 인덱스에 대한 항목이 포함되어 있습니다. "name" 열에는 XML 인덱스의 이름이 포함되어 있습니다.

또한 sys.indexes의 모든 열과 XML 인덱스와 관련된 몇 가지 특수한 열을 포함하는 카탈로그 뷰 sys.xml_indexes에 XML 인덱스가 기록됩니다. "secondary_type" 열의 NULL 값은 기본 XML 인덱스를 나타내고 ''P'', ''R'' 및 ''V'' 값은 각각 PATH, PROPERTY 및 VALUE 보조 XML 인덱스를 나타냅니다. "secondary_type_desc" 열에는 기본 XML 인덱스를 나타내는 NULL과 세 가지 유형의 보조 XML 인덱스를 나타내는 "PATH", "PROPERTY" 및 "VALUE" 문자열이 포함되어 있습니다.

테이블 반환 함수 dm_db_index_physical_stats()에서는 XML 인덱스의 공간 사용을 확인할 수 있습니다. 사용된 디스크 페이지 수, 평균 행 크기(바이트), 레코드 수, XML 인덱스를 비롯한 모든 인덱스 유형에 대한 기타 정보가 제공되며 이러한 정보는 각 데이터베이스 파티션에 사용할 수 있습니다. 즉, XML 인덱스는 기본 테이블의 동일한 분할 스키마와 분할 함수를 사용합니다.

예제: XML 인덱스의 공간 사용

SELECT sum (page_count)
FROM sys.dm_db_index_physical_stats (db_id(), object_id(''docs''),
DEFAULT, DEFAULT, ''DETAILED'') SDPS
JOIN sys.xml_indexes SXI ON (SXI.index_id = SDPS.index_id)
WHERE SXI.name = ''idx_xCol_Path''

위 예제는 모든 파티션에서 테이블 T의 XML 인덱스 idx_xCol_Path에 사용되는 디스크 페이지 수를 생성합니다. sum() 함수가 없을 경우 파티션당 디스크 페이지 사용량이 결과로 반환됩니다.

XML 스키마 처리

XML 스키마는 시스템에서 선택 사항입니다. 앞에서 언급한 것처럼 XML 스키마에 바인딩되지 않은 XML 데이터 형식은 형식없는 XML로 간주됩니다. 이 경우에 XML 노드 값은 유니코드 문자열로 저장되며 XML 인스턴스는 형식이 올바른지 검사됩니다. 형식없는 XML 열은 인덱싱될 수 있습니다.

XML 데이터 형식을 XML 스키마 컬렉션에 등록된 XML 스키마와 연관시키는 방법으로 XML을 형식화합니다. 새로운 DDL 문을 사용하면 하나 이상의 XML 스키마가 등록될 수 있는 XML 스키마 컬렉션을 만들 수 있습니다. XML 스키마 컬렉션에 바인딩된 XML 열, 매개 변수 또는 변수는 컬렉션의 모든 XML 스키마에 따라 형식화됩니다. XML 스키마 컬렉션 내에서 형식 시스템은 대상 네임스페이스를 사용하여 각 XML 스키마를 식별합니다.

XML 인스턴스의 각 최상위 XML 요소는 자신이 따르는 가능한 빈 대상 네임스페이스를 지정해야 합니다. 각 최상위 요소의 대상 네임스페이스에 따라 삽입 및 수정 도중에 데이터의 유효성이 검사됩니다. 이진 XML 표현은 연관된 XML 스키마 정보에 기초하여 형식있는 값을 인코딩하면 완전하게 설명되므로 형식없는 XML과 비교했을 때 재분석 작업이 더 효율적으로 수행됩니다. 또한 XML 인덱스에서 값이 올바르게 형식화됩니다(/book/price는 XML 스키마에 xs:decimal로 정의된 경우 십진수로 저장됨).

쿼리 컴파일 도중에 형식 검사를 위해 XML 스키마가 사용되며 형식이 불일치하면 정적 오류가 발생합니다. 또한 쿼리 컴파일러는 쿼리 최적화를 위해 XML 스키마를 사용합니다.

데이터베이스 엔진의 메타데이터 하위 시스템에는 XML 스키마 컬렉션과 포함된 해당 XML 스키마, 기본 XSD 및 관계형 형식 시스템 간의 매핑 등과 같은 XML 형식 정보가 들어 있습니다. 거의 모든 W3C XML Schema 1.0 사양(http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/ (영문) 및 http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/ (영문) 참조)이 지원됩니다. XML 스키마 문서의 설명과 주석은 유지되지 않으며 key/keyref는 지원되지 않습니다.

XML 스키마 컬렉션

XML 스키마 컬렉션은 관계형 스키마에 의해 범위가 지정되는 메타데이터 엔터티이며 서로 관련되거나(예: 사용) 관련되지 않을 수 있는 하나 이상의 XML 스키마를 포함합니다. XML 스키마 컬렉션 내의 개별 XML 스키마는 대상 네임스페이스를 사용하여 식별합니다. XML 스키마 컬렉션은 테이블과 매우 비슷한 보안 가능한 엔터티입니다.

CREATE XML SCHEMA COLLECTION 구문을 사용하고 하나 이상의 XML 스키마를 제공하는 방법으로 XML 스키마 컬렉션을 만듭니다. 그런 다음 XML 스키마 컬렉션을 사용하여 XML 열을 형식화할 수 있습니다. 이 디자인은 다른 XML 스키마에 따라 형식화된 XML을 동일한 열에 저장할 수 있는 유연한 데이터 모델을 제공하며 특히 XML 스키마 수가 많은 경우에 편리하게 사용할 수 있습니다. 또한 이 디자인은 XML 스키마를 어느 정도 확장하는 것을 지원합니다.

또한 형식화된 XML 열의 DOCUMENT 또는 CONTENT 옵션은 각각 XML 트리 또는 단편이 XML 열에 저장될 수 있는지 여부를 지정합니다. 기본 동작은 CONTENT입니다. DOCUMENT의 경우 각 XML 인스턴스는 최상위 요소의 대상 네임스페이스를 지정해야 하며 이 대상 네임스페이스에 따라 인스턴스의 유효성 검사 및 형식화가 수행됩니다. 반면, CONTENT의 경우 각 최상위 요소는 XML 스키마 컬렉션에서 대상 네임스페이스 중 하나를 지정할 수 있습니다. XML 인스턴스는 인스턴스에서 발생하는 모든 대상 네임스페이스에 따라 유효성 검사 및 형식화됩니다.

예제: XML 스키마 컬렉션 만들기

대상 네임스페이스가 http://myBooks인 XML 스키마를 사용하여 XML 인스턴스를 형식화한다고 가정해 보십시오. 이 경우 아래 나온 것처럼 XML 스키마 컬렉션 myCollection을 만들고 XML 스키마를 myCollection의 콘텐츠로 제공합니다.

CREATE XML SCHEMA COLLECTION myCollection AS
''xmlns="http://myBooks"
elementFormDefault="qualified"
targetNamespace="http://myBooks">






















''

XML 스키마가 등록된 myCollection에 대해 새 메타데이터 엔터티가 만들어집니다. 다음과 같이 새 행을 XmlCatalog 테이블(앞에 나온 "예제: 테이블의 형식화된 XML 열" 참조)에 추가할 수 있습니다.

INSERT XmlCatalog VALUES(1, ''<?xml version="1.0"?>

ISBN="1-861003-11-0">


Benjamin
Franklin

8.99

ISBN="0-201-63361-2">


Herman
Melville

11.99

ISBN="1-861001-57-6">


Sidas
Plato

9.99


'')

XML 스키마 컬렉션 수정

ALTER XML SCHEMA COLLECTION 문은 새 최상위 스키마 구성 요소와 함께 XML 스키마 컬렉션의 XML 스키마를 확장하고 새 XML 스키마를 XML 스키마 컬렉션에 등록하는 것을 지원합니다. 아래 예제에서 이러한 사실을 알 수 있습니다.

예제: XML 스키마 컬렉션 변경

다음 문은 대상 네임스페이스가 http://myDVD인 새 XML 스키마를 XML 스키마 컬렉션 myCollection에 추가하는 방법을 보여 줍니다.

ALTER XML SCHEMA COLLECTION myCollection ADD
''xmlns="http://myDVD"
elementFormDefault="qualified"
targetNamespace="http://myDVD">














''

XML 스키마 컬렉션의 카탈로그 뷰

XML 스키마 컬렉션의 SQL 카탈로그 뷰를 사용하면 개별 XML 스키마 네임스페이스의 내용을 사용자가 다시 구성할 수 있습니다. XML 스키마 컬렉션은 카탈로그 뷰 sys.xml_schema_collections에 열거됩니다. XML 스키마 컬렉션 "sys"는 시스템에 의해 정의되며 모든 사용자 정의 XML 스키마 컬렉션에서 사용될 수 있는 미리 정의된 네임스페이스를 포함합니다(이러한 네임스페이스를 명시적으로 로드할 필요가 없음). xml, xs, xsi, fn 및 xdt에 대한 네임스페이스가 이러한 네임스페이스에 해당합니다.

언급할 필요가 다른 두 가지 카탈로그 뷰는 각 XML 스키마 컬렉션 내의 모든 네임스페이스를 열거하는 sys.xml_schema_namespaces와 각 XML 스키마 내의 모든 XML 스키마 구성 요소를 열거하는 sys.xml_schema_components입니다.

기본 제공 함수인 XML_SCHEMA_NAMESPACE()에서는 관계형 스키마의 이름, XML 스키마 컬렉션 및 XML 스키마의 대상 네임스페이스(선택 사항)가 사용됩니다. 이 함수는 XML 스키마가 포함된 XML 데이터 형식 인스턴스를 반환합니다. 대상 네임스페이스 인수가 없을 경우 이 기본 제공 함수는 미리 정의된 XML 스키마를 제외한 XML 스키마 컬렉션의 모든 스키마를 포함하는 XML 인스턴스를 반환합니다.

예제: XML 스키마 컬렉션의 XML 네임스페이스 열거

XML 스키마 컬렉션 "myCollection"에 다음 쿼리를 사용합니다.

SELECT XSN.name
FROM sys.xml_schema_collections XSC
JOIN sys.xml_schema_namespaces XSN ON
(XSC.xml_collection_id = XSN.xml_collection_id)
WHERE XSC.name = ''myCollection''

예제: XML 스키마 컬렉션에서 지정된 XML 스키마 출력

다음 문은 (관계형) 스키마 dbo 내의 XML 스키마 컬렉션 "myCollection"에서 대상 네임스페이스가 http://myBooks인 XML 스키마를 출력합니다.

SELECT XML_SCHEMA_NAMESPACE (N''dbo'', N''myCollection'',
N''http://myBooks'')

XML 스키마 컬렉션에서의 액세스 제어

SQL Server 2005의 보안 모델을 사용하여 다른 SQL 개체와 마찬가지로 XML 스키마 컬렉션을 보안할 수 있습니다. 데이터베이스 내에서 XML 스키마 컬렉션을 만들 수 있는 권한을 사용자에게 부여할 수 있습니다. 각 XML 스키마 컬렉션은 ALTER, CONTROL, TAKE OWNERSHIP, REFERENCES, EXECUTE 및 VIEW DEFINITION 권한을 지원합니다.

  • ALTER XML SCHEMA COLLECTION 문을 실행하려면 ALTER 권한이 필요합니다.

  • ALTER AUTHORIZATION 문을 실행하여 XML 스키마 컬렉션의 소유권을 특정 사용자에서 다른 사용자에게 양도하려면 TAKE OWNERSHIP 권한이 필요합니다.

  • REFERENCES 권한은 스키마 바인딩이 필요할 때마다(예: XML 열과 매개 변수를 형식화 및 제약하는 경우) XML 스키마 컬렉션을 사용할 수 있는 권한을 사용자에게 부여합니다.

  • 사용자가 삽입하거나 업데이트한 값을 XML 스키마 컬렉션과 비교하여 유효성을 검사하려면 EXECUTE 권한이 필요합니다. 또한 XML 데이터 형식을 사용하여 형식있는 XML 열, 변수 및 매개 변수에서 값을 쿼리하려면 이 권한이 필요합니다.

  • VIEW DEFINITION 권한은 XML 스키마 컬렉션에 해당하는 카탈로그 뷰의 행, XML 스키마 컬렉션에 포함된 모든 XML 스키마, 이러한 XML 스키마에 포함된 모든 스키마 구성 요소에 액세스할 수 있는 권한을 사용자에게 부여합니다.

  • CONTROL 권한은 DROP XML SCHEMA COLLECTION 문을 사용하여 XML 스키마 컬렉션을 삭제하는 것을 비롯하여 XML 스키마 컬렉션에서 작업을 수행할 수 있는 권한을 사용자에게 부여합니다. 이 권한은 XML 스키마 컬렉션에 대한 다른 권한을 나타냅니다.

테이블 또는 XML 열에 대한 다른 권한 외에도 XML 스키마 컬렉션에 대한 권한이 필요합니다. 예를 들어, XML 스키마 컬렉션 C에 따라 형식화된 XML 열 X가 있는 테이블 T를 만들려면 사용자는 테이블을 만들 수 있는 권한과 XML 스키마 컬렉션 C에 대한 REFERENCES 권한이 있어야 합니다. XML 스키마 컬렉션 C에 대한 EXECUTE 권한이 있는 경우에는 열 X에 데이터를 삽입할 수 있는 권한을 가진 사용자가 이러한 작업을 수행할 수 있습니다. 마찬가지로 XML 데이터 형식 메서드를 사용하여 열 X의 데이터를 쿼리하려면 사용자는 열 X에 대한 SELECT 권한과 C에 대한 EXECUTE 권한이 필요합니다. 그러나 SELECT X FROM T 또는 SELECT * FROM T에서와 같이 열 X에서 전체 XML 값을 검색하려면 X에 대한 SELECT 권한만 있으면 충분합니다.

SQL Server 2005의 보안 모델을 통해 권한을 허용하는 것과 마찬가지로 사용자로부터 권한을 해지하고 사용자의 권한을 거부할 수 있습니다.

카탈로그 뷰 액세스

XML 스키마 컬렉션에 대한 ALTER, TAKE OWNERSHIP, REFERENCES, VIEW DEFINITION 또는 CONTROL 권한을 가지는 사용자는 XML 스키마 컬렉션, 포함된 XML 스키마, XML 스키마 구성 요소 등에 대한 카탈로그 뷰 행에 액세스할 수 있습니다. 또한 이러한 권한이 있는 사용자는 기본 제공 함수 XML_SCHEMA_NAMESPACE() 및 FOR XML ?… XMLSCHEMA를 사용하여 XML 스키마 컬렉션의 내용에 액세스할 수 있습니다.

사용자는 VIEW DEFINITION 권한이 거부된 경우 XML 스키마 컬렉션을 카탈로그 뷰에서 액세스하거나 XML_SCHEMA_NAMESPACE() 또는 FOR XML ?… XMLSCHEMA를 사용하여 액세스할 수 없습니다.

FOR XML향상

TYPE 지시문은 XML 데이터 형식 메서드를 사용하여 XML 열, 변수 또는 매개 변수에 할당하거나 쿼리할 수 있는 XML 데이터 형식 인스턴스를 생성합니다. 이 지시문의 기능을 통해 SELECT ... FOR XML TYPE 문을 중첩할 수 있습니다.

PATH 모드를 사용하면 열 값이 표시되어야 하는 XML 트리의 경로를 지정할 수 있습니다. 계층이 깊은 경우에 제대로 작동하지 않을 수 있지만 앞서 언급한 중첩과 함께 PATH 모드를 FOR XML EXPLICIT보다 간편하게 작성할 수 있습니다.

ELEMENTS와 함께 사용되는 XSINIL 지시문은 xsi:nil="true" 특성을 가지는 요소에 NULL을 매핑합니다. 새 ROOT 지시문은 FOR XML의 모든 노드에 루트 노드를 지정할 수 있게 합니다. 새 XMLSCHEMA 지시문은 XSD 인라인 스키마를 생성합니다.

향상된 기능과 예제에 대한 자세한 내용은 [4]를 참조하십시오.

성능 지침

XML 데이터 모델은 관계형 데이터 모델보다 풍부하고 복잡합니다. XML 데이터 모델을 사용하여 복잡한 데이터를 모델링할 수 있을 뿐만 아니라 데이터 내의 계층적 관계와 문서 순서를 유지할 수 있습니다. 문서 순서는 XML 노드 식별자에 기초한 정렬에 의해 유지 관리되며 이와 동시에 계층적 관계가 유지 관리됩니다. 이러한 특징은 더 복잡한 쿼리 계획에 유용합니다.

더 나은 성능을 위해 구조적 데이터가 테이블의 관계형 열에 저장되어야 합니다. 데이터는 반구조적 또는 구조화되지 않은 XML 태그가 포함되어 있지만 성능 향상을 고려할 필요가 없다면 모델링 요구를 충족하는 XML 데이터 모델을 선택합니다. XML 스키마는 쿼리 최적화에 도움이 됩니다.

SQL Server CLR의 XML 지원

SQL Server CLR 지원을 사용하면 관리되는 코드에서 서버 쪽 논리를 작성하여 비즈니스 규칙을 적용할 수 있습니다. 다음과 같은 여러 방법으로 이 비즈니스 논리를 XML 데이터에 추가할 수 있습니다.

  • XML 값이 전달되는 SQLCLR 함수를 관리되는 코드로 작성할 수 있으며 System.Xml 네임스페이스가 제공하는 XML 처리 기능을 사용할 수 있습니다. 아래 나온 것처럼 XSL 변환을 XML 데이터에 적용하는 경우를 예로 들 수 있습니다. 또는 XML을 하나 이상의 관리되는 클래스로 직렬해제하고 관리되는 코드를 사용하여 이러한 클래스를 처리할 수 있습니다.

  • 비즈니스 요구를 위해 XML 열에서 처리를 호출하는 T-SQL 저장 프로시저 및 함수를 작성할 수 있습니다.

예제: XSL 변환 적용

XSL 변환을 위한 XML 데이터 형식 인스턴스와 파일 경로를 사용하고 변환을 XML 데이터에 적용하며 변환된 XML을 결과로 반환하는 CLR 함수 TransformXml.ApplyXslTransform()이 있다고 가정해 보십시오. C#로 작성된 기초 함수는 다음과 같습니다.

using System;
using System.Data.SqlTypes;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

public class TransformXml
{
public static SqlXml ApplyXslTransform (
SqlXml XmlData, string xslPath) {
// Load XSL transformation
XslCompiledTransform xform = new XslCompiledTransform();
xform.Load (xslPath);

// Load XML data
XPathDocument xDoc = new XPathDocument (XmlData.CreateReader());
XPathNavigator nav = xDoc.CreateNavigator ();

// Apply the transformation
// using makes sure that we flush the writer at the end
using (XmlWriter writer = nav.AppendChild())
{
xform.Transform(XmlData.CreateReader(), writer);
}

// Return the transformed value
SqlXml retSqlXml = new SqlXml (nav.ReadSubtree());
return (retSqlXml);
}
}

CREATE FUNCTION 문을 사용하여 작성한 ApplyTransformXml()에 해당하는 사용자 정의 T-SQL 함수 SqlXslTransform()과 CREATE ASSEMBLY 문을 사용하여 데이터베이스에서 어셈블리를 등록해야 합니다. 이러한 문에 대한 자세한 내용은 SQL Server 2005 온라인 설명서를 참조하십시오. 그런 다음 아래 쿼리와 같이 T-SQL에서 SQL 함수를 호출할 수 있습니다.

SELECT SqlXslTransform (xCol, ''C:\temp\xsltransform.xsl'')
FROM docs
WHERE xCol.exist(''/book/title/text()[contains(.,"secure")]'') =1

쿼리 결과에는 변환된 XML의 행 집합이 포함됩니다.

  • SQLCLR은 XML 데이터를 테이블 또는 속성 승격으로 분해하고 System.Xml 네임스페이스에서 관리되는 클래스를 사용하여 XML 데이터를 쿼리하는 데 사용할 수 있는 새로운 기능을 제공합니다. 자세한 내용은 SQL Server 2005 및 Visual Studio 2005 온라인 설명서에서 확인할 수 있습니다.

SQL Server 2005의 클라이언트 쪽 XML 처리

XML 데이터 형식에 대한 클라이언트 쪽 지원

XML 데이터 형식에 대한 클라이언트 액세스는 ADO.NET, SQL 네이티브 클라이언트(SQLNCLI) 및 SOAP over HTTP를 사용하여 제공됩니다. 처음 두 개는 아래 설명되어 있으며 SOAP 액세스의 경우는 SQL Server 온라인 설명서를 참조하십시오.

.NET Framework V2.0의 ADO.NET XML 지원

XML 데이터 형식은 SqlDataReader.GetSqlXml() 메서드에서 System.Data.SqlTypes 네임스페이스의 SqlXml 클래스로 제공됩니다. SqlXml.CreateReader() 함수를 사용하여 SqlXml 개체에서 XmlReader를 얻을 수 있습니다.

XML 열을 형식화하는 XML 스키마 컬렉션의 세 부분으로 된 이름은 XML 열 메타데이터에서 얻을 수 있습니다(SqlDataReader 개체에서 GetSchemaTable() 또는 GetSqlMetaData (int) 사용). 이러한 이름은 데이터베이스 이름(XmlSchemaCollectionDatabase), 관계형 스키마 이름(XmlSchemaCollectionOwingSchema) 및 XML 스키마 컬렉션 이름(XmlSchemaCollectionName)을 나타내는 세 개의 속성으로 구성됩니다.

클라이언트는 새로운 스키마 행 집합 XMLSCHEMA를 사용하여 서버에서 XML 스키마를 검색할 수 있습니다. XMLSCHEMA 행 집합에는 XML 스키마 컬렉션, 대상 네임스페이스 및 XML 스키마 콘텐츠 자체를 위한 세 개의 열이 포함되어 있습니다.

다음 예제는 XML 데이터 형식에 대한 관리되는 액세스를 위한 기초 코드를 보여 줍니다.

예제: XML 데이터 형식에 대한 in-proc 액세스

아래의 C# 코드는 in-proc 공급자에서 XML 데이터 형식을 액세스할 수 있는 방법을 보여 줍니다. 아래 나온 컨텍스트 연결을 통해 CLR 코드가 호출되었던 컨텍스트와 동일한 컨텍스트에서 SQL 문을 실행할 수 있습니다. out-of-proc 액세스의 경우 데이터베이스에 대한 새 연결을 설정해야 합니다.

using System;
using System.Xml;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;

class xmldtADONETReadAccessInProc
{
static void ReadXmlDataType () {
// in-proc connection to server
SqlConnection conn = new SqlConnection("context connection=true");

// prepare query to select xml data
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT xCol.query(''//section'') FROM docs";

// execute query and retrieve incader();
r.Read();oming data
SqlDataReader r = cmd.ExecuteRe

// access XML data type field in rowset
SqlXml xml = r.GetSqlXml(0);
new XmlTextWriter(Console.Out).WriteNode(
xml.CreateReader(), true);
}
}

예제: FOR XML TYPE 결과 액세스

TYPE 지시문이 있는 FOR XML은 관리되는 클라이언트가 SqlXml 클래스를 사용하여 검색할 수 있는 XML 데이터 형식 인스턴스를 생성합니다. 따라서 다음과 같이 cmd.CommandText 수정 시에 위 예제의 코드가 동일하게 유지됩니다.

cmd.CommandText =
"SELECT xCol.query(''//section'') FROM docs FOR XML AUTO, TYPE";

예제: SQL 클라이언트 공급자를 사용하여 XML 데이터 형식 열 업데이트

아래 코드는 SQL 클라이언트 공급자를 사용하여 XML 열의 값을 대체하는 WriteXmlDataType() 메서드를 보여 줍니다. in-proc 공급자에 대한 코드는 비슷합니다.

using System;
using System.Xml;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;

class xmldtADONETUpdateAccess
{
static void WriteXmlDataType () {
// connection to server
SqlConnection conn = new SqlConnection("server=server1;" +
" database=XMLtest; Integrated Security=SSPI");
conn.Open();

// update XML column at the server
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "UPDATE docs SET xCol=@x WHERE id=1";

// set value of XML parameter
SqlParameter p = cmd.Parameters.Add("@x", SqlDbType.Xml);
p.Value = new SqlXml(new XmlTextReader("",
XmlNodeType.Document, null));

// execute update and close connection
cmd.ExecuteNonQuery();
conn.Close();
}
}

SQL 네이티브 클라이언트 액세스

새 SQL 네이티브 액세스(SQLNCLI)의 OLE DB 공급자에서 IsequentialStream을 사용하여 XML 데이터 형식 열을 유니코드 텍스트(DBTYPE_XML, DBTYPE_BYTES, DBTYPE_BSTR, DBTYPE_WSTR 및 DBTYPE_VARIANT) 또는 유니코드 문자 스트림(DBTYPE_UNKNOWN)으로 검색할 수 있습니다. 기본값은 DBTYPE_XML입니다. XML 데이터는 UTF-16 인코딩으로 서버에 전송할 수 있으며 이 경우에 응용 프로그램은 이미 UTF-16으로 인코딩되었다는 것을 확인해야 합니다. 처음 두 개의 바이트에는 바이트 순서 표시 0xFFFE가 필요합니다. 다른 인코딩이 데이터베이스 서버의 인코딩과 호환될 경우에는 응용 프로그램에서 XML 데이터를 다른 인코딩으로 서버에 보낼 수 있습니다. XML 데이터 내에 지정된 인코딩이 적용됩니다. 다른 모든 경우에 XML은 이진 데이터로 전송되어야 합니다.

세 부분으로 된 XML 스키마 컬렉션 이름은 IDBSchemaRowset::GetRowset()이 반환하는 COLUMNS 스키마 행 집합의 새로운 세 개 열로 전달됩니다. 이러한 열 중에서 SS_XML_SCHEMACOLLECTION_CATALOGNAME은 카탈로그의 이름을 제공하고 SS_XML_SCHEMACOLLECTION_SCHEMANAME은 XML 스키마 컬렉션이 상주하는 관계형 스키마의 이름을 제공하며 SS_XML_SCHEMACOLLECTIONNAME은 XML 스키마 컬렉션의 이름을 제공합니다. 이러한 이름의 형식은 DBTYPE_WSTR입니다. 데이터 검색 및 업데이트를 위한 형식없는 XML 열의 경우 이러한 열은 NULL 값을 가집니다.

PROCEDURE_PARAMETERS 스키마 행 집합 및 IColumnRowset:GetColumnRowset()에도 비슷한 변경 사항이 적용되었습니다.

XML 스키마 컬렉션의 내용을 검색하려면 클라이언트는 XML_SCHEMA_NAMESPACE() 호출에서 이러한 이름을 사용하여 서버에 대한 별개의 액세스를 수행하고 XML 스키마를 XML 데이터 형식으로 가져올 수 있습니다. 또는 새 SS_XMLSCHEMA 스키마 행 집합을 가진 IDBSchemaRowset는 카탈로그 이름, 관계형 스키마 이름, XML 스키마 컬렉션 이름, 대상 네임스페이스 및 XNK 스키마를 반환합니다.

SQLNCLI를 사용하는 ODBC 액세스의 경우 XML 데이터 형식은 SQL_SS_XML이라는 유니코드 변수 길이 문자 데이터에 매핑됩니다. 세 부분으로 된 XML 스키마 컬렉션 이름은 XML 열에 대한 SqlColAttribute를 통해 CharacterAttributePtrCharacterAttributePtr로 표면화됩니다. 이러한 필드 식별자는 각각 데이터베이스 이름, 관계형 스키마 이름 및 XML 컬렉션 이름을 나타내는 SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SQL_CA_SS _XML_SCHEMACOLLECTION_SCHEMA_NAME 및 SQL_CA_SS _XML_SCHEMACOLLECTION_NAME입니다.

사용자는 SQL 네이티브 클라이언트를 가져오려면 SQL Server 2005 릴리스의 데이터베이스 서버 또는 클라이언트 도구를 설치해야 합니다.

기본적으로 SQL Server 2005의 XML 데이터는 SQLOLEDB를 통해 MDAC API에서 DBTYPE_WSTR로 사용할 수 있습니다. XML 열을 사용자 정의 함수의 결과로 SQL Server 2005 전의 클라이언트에게 반환할 수는 없습니다. 이것을 시도하려고 하면 오류가 반환됩니다.

SQLXML-XML 및 관계형 스키마 사이의 매핑

SQLXML 매핑 기술을 사용하여 관계형 데이터의 논리적 XML 뷰를 만들 수 있습니다. "매핑" 또는 "주석 달린 스키마"라고도 부르는 XML 뷰는 주어진 XSD 스키마에 특수한 주석을 추가하여 만듭니다. 그런 다음 다른 SQLXML 기술에서 이 주석 달린 스키마를 사용하여 논리적 XML 뷰에 대한 쿼리와 업데이트를 관계형 테이블에 대한 쿼리와 업데이트로 변환할 수 있습니다.

  • XML 뷰가 Xpath 쿼리와 결합된 경우 SQLXML은 요청된 데이터를 찾고 스키마에 지정된 대로 형태를 만들기 위해 FOR XML 쿼리를 생성합니다.

  • SQLXML Updategram은 XML 인스턴스의 변경 사항을 나타내며 이러한 변경 사항이 주석 달린 스키마와 결합된 경우 낙관적 동시성을 사용하여 관계형 변경 사항에 다시 적용되므로 적절한 데이터가 업데이트됩니다.

  • SQLXML Bulkload는 XML 뷰를 사용하여 XML 데이터를 관계형 테이블로 "분산"시킵니다.

이러한 주제에 대한 자세한 내용은 온라인으로 보거나 다운로드할 수 있는 SQLXML 설명서 (영문)에 나와 있습니다.

관계형 테이블의 XML 뷰 만들기

데이터베이스의 XML 뷰를 만들려면 XML 데이터에 대한 XSD 스키마를 사용하여 시작합니다. 데이터베이스 테이블/뷰의 행은 스키마의 복합 형식 요소에 매핑됩니다. 데이터베이스의 열 값은 특성 또는 단순 형식 요소에 매핑됩니다.

기본적으로 명시적 주석이 제공되지 않은 경우 SQLXML은 복합 형식 요소가 테이블에 매핑되고 단순 형식 요소 및 특성이 열에 매핑된다고 가정합니다. 이러한 가정은 요소와 특성의 이름이 데이터베이스에 있는 테이블과 열의 이름과 정확하게 일치할 경우에만 적용됩니다.

요소/특성의 이름이 매핑되는 테이블/뷰 또는 열 이름과 같지 않을 경우 명시적 매핑을 만들어야 합니다. XML 문서의 요소 또는 특성과 데이터베이스의 테이블(뷰) 또는 열 사이에 매핑을 지정하기 위해 다음 주석이 사용됩니다.

  • sql:relation- XML 요소를 데이터베이스 테이블에 매핑합니다.

  • sql:field- 요소나 특성을 데이터베이스 열에 매핑합니다.

XML 뷰에서 계층을 만들기 위해 관계 매핑

데이터베이스에서 테이블은 외래 키 관계로 관련될 수 있습니다. XML에서 이와 동일한 관계는 요소의 중첩 계층으로 표현됩니다. 매핑에서 적절한 중첩을 생성하려면 요소가 관련되는 방법을 지정해야 합니다. sql:relationship 주석을 사용하여 매핑 스키마 요소 사이에 이러한 관계를 설정할 수 있습니다. 이 주석에서는 부모 및 자식 테이블뿐만 아니라 조인을 수행하기 위해 사용해야 하는 각 테이블의 열을 지정할 수 있습니다. 그런 다음 SQLXML은 이 정보를 사용하여 매핑에 맞는 적절한 중첩 계층을 생성합니다.

오버플로를 사용하여 사용되지 않는 데이터 저장

XML 데이터에 규칙적인 구조가 있을 경우에 매핑이 작동합니다. 그러나 XML에 구조적이지 않은 데이터나 특정 열에 매핑되지 않은 데이터가 존재할 수 있습니다. 이러한 데이터를 저장하여 나중에 검색하려면 sql:overflow 주석을 사용합니다. sql:overflow 주석은 사용되지 않는 모든 데이터가 저장되는 열과 쿼리 시에 데이터를 검색하는 위치를 지정합니다.

또한 오버플로 열을 사용하면 데이터베이스에 추가할 필요 없이 XML을 확장할 수 있습니다. 데이터베이스에 저장하기 위해 열을 추가하지 않더라도 요소와 특성을 언제든지 XML 구조에 추가할 수 있습니다. 요소와 특성은 단순히 오버플로 필드에 저장되며 적절한 때에 검색됩니다.

추가 정보

XML 뷰를 작성하는 방법과 매핑 예제는 주석 달린 XSD 스키마를 사용하여 XML 뷰 만들기(영문)를 참조하십시오.

Xpath를 사용하여 XML 뷰 쿼리

데이터베이스의 XML 뷰를 만든 후에는 Xpath 쿼리 언어를 사용하여 실제 XML 문서인 것처럼 해당 뷰를 쿼리할 수 있습니다. SQLXML은 XPath 1.0 쿼리 언어의 하위 집합을 지원합니다. 매핑에 대해 Xpath가 실행되면 SQLXML은 Xpath를 하나로 구성하고 SQL Server로 보내지는 FOR XML EXPLICIT 문을 만듭니다. 적절한 데이터가 검색된 다음 매핑에 따라 형태가 지정됩니다.

XML 뷰에서 지원되는 Xpath의 하위 집합에 대한 자세한 내용은 SQLXML 설명서를 참조하십시오.

Updategram을 사용하여 XML 뷰를 통해 업데이트

데이터베이스의 XML 뷰에 대해 Updategram을 사용하여 SQL Server에서 XML 뷰를 통해 데이터베이스를 수정(삽입, 업데이트 또는 삭제)할 수 있습니다.

Updategram의 구조

updategram은 updategram의 구문을 구성하는 ,
요소를 가진 XML 문서입니다. 각 블록에는 하나 이상의 블록이 포함되어 있습니다. 는 레코드 인스턴스의 기존 상태("이전 상태"라고도 함)를 식별합니다. 는 데이터가 변경될 새 상태를 식별합니다. updategram이 레코드 인스턴스를 삭제, 삽입 또는 업데이트하는지 여부는 블록의 내용에 따라 달라집니다.

삽입 작업

레코드 인스턴스가
블록에 있지만 해당 블록에 없을 경우 updategram은 삽입 작업을 나타냅니다. 이 경우 updategram은 블록의 레코드를 데이터베이스에 삽입합니다.

삭제 작업
br> 레코드 인스턴스가 블록에 있지만
블록에 해당 레코드가 없을 경우 updategram은 삭제 작업을 나타냅니다. 이 경우 updategram은 의 레코드를 데이터베이스에서 삭제합니다.

updategram에 지정된 요소가 테이블에 있는 두 개 이상의 행과 일치하거나 어떠한 테이블 행과도 일치하지 않을 경우 updategram은 오류를 반환하고 전체 블록을 취소합니다. updategram의 요소는 한 번에 하나의 레코드만 삭제할 수 있습니다.

업데이트 작업

기존 데이터를 업데이트할 경우
블록을 모두 지정해야 합니다. updategram은 블록에 지정된 요소를 사용하여 데이터베이스의 기존 레코드를 식별합니다. 블록의 해당 요소는 업데이트 작업 실행 후에 레코드가 가져야 하는 모양을 나타냅니다.

블록의 요소는 데이터베이스에 있는 단지 하나의 테이블 행과 일치해야 합니다. 요소가 여러 테이블 행과 일치하거나 어떠한 테이블 행과도 일치하지 않을 경우 updategram은 오류를 반환하고 전체 블록을 취소합니다.

추가 정보

updategram을 작성 및 사용하여 XML 뷰를 통해 데이터를 수정하는 방법에 대한 자세한 내용은 Updategram을 사용하여 데이터 수정 (영문)을 참조하십시오.

XML 뷰를 통해 XML 데이터 대량 로드

XML 대량 로드는 XML 데이터를 SQL 서버 테이블에 로드할 수 있게 하는 COM 개체입니다. INSERT 문과 OPENXML 함수를 사용하여 XML 데이터를 SQL Server 데이터베이스에 삽입할 수 있습니다. 그러나 대량의 XML 데이터를 삽입해야 할 경우 이 대량 로드 유틸리티가 더 높은 성능을 제공합니다. XML 대량 로드는 매핑 스키마를 해석하고 XML 데이터가 삽입되는 테이블을 식별합니다. 그런 다음 XML 대량 로드는 XML 데이터를 관계형 테이블에 분산시킵니다.

소스 XML 문서가 매우 클 수 있기 때문에 대량 로드 처리에서 전체 문서를 메모리로 읽어 들이지는 않습니다. 대신에 XML 대량 로드는 XML 데이터를 스트림으로 해석하고 읽습니다. 데이터를 읽을 때 이 유틸리티는 데이터베이스 테이블을 식별하고 XML 데이터 소스에서 해당 레코드를 생성한 다음 삽입을 위해 레코드를 SQL Server로 보냅니다.

대량 로드가 작동하는 방법과 대량 로드를 사용하는 방법에 대한 자세한 내용은 XML 데이터의 대량 로드 수행 (영문)을 참조하십시오.

SQLXML 데이터 액세스 방법

SQL Server 2000 이후에 SQLXML 기능에 액세스하는 다음 두 가지 방법이 새로 추가되었습니다.

  • SQLXML 관리되는 클래스

  • SQLXML 웹 서비스

또한 템플릿 내에서 Updategram 지원을 제공하기 위해 SQL Server에 대한 HTTP 액세스가 향상되었습니다.

SQLXML 관리되는 클래스

SQLXML 관리되는 클래스는 Microsoft .NET Framework 내부에서 SQLXML 3.0 기능을 제공합니다. SQLXML 관리되는 클래스를 사용하면 C# 응용 프로그램을 작성하여 SQL Server 인스턴스에서 XML 데이터에 액세스하고 데이터를 .NET Framework 환경에 가져온 다음에 데이터를 처리한 후 업데이트를 SQL Server로 되돌려 보냄으로써 업데이트를 적용할 수 있습니다.

SQLXML 관리되는 클래스를 사용하는 방법에 대한 자세한 내용은 SQLXML .NET 지원 (영문)을 참조하십시오.

SQLXML 웹 서비스

SQLXML의 웹 서비스 지원은 SQL Server 기능을 클라이언트에게 제공하는 웹 서비스로 SQL Server를 제공합니다. SQLXML을 실행하는 서버로 SOAP HTTP 요청을 전송하여 저장 프로시저, 사용자 정의 함수(UDF) 및 템플릿을 실행할 수 있습니다.

또한 포함된 SQL Server용 IIS 가상 디렉터리 관리 유틸리티를 사용하여 웹 서비스를 설정합니다. 웹 서비스 가상 디렉터리가 설정된 후에는 저장 프로시저와 템플릿을 사이트에 추가할 수 있습니다. 그런 다음 클라이언트는 SOAP 프로토콜을 사용하여 HTTP을 통해 이러한 서비스에 액세스할 수 있습니다.

SQL Server 2005는 이제 서버 내에서 웹 서비스를 기본적으로 지원합니다. 그러나 단지 SQLXML만 웹 서비스를 통해 XML 템플릿에 액세스하는 기능을 지원합니다. 또한 데이터베이스 서버가 아닌 서버에 SQLXML을 설정할 수 있으며 이 경우 데이터베이스에서 떨어져 있는 별개의 중간 계층 서버가 만들어집니다.

SQLXML 웹 서비스에 대한 자세한 내용은 SQLXML의 웹 서비스(SOAP) 지원 (영문)에서 확인할 수 있습니다.

결론

이 기사에서는 SQL Server 2005의 XML을 보완하는 기술에 대해 설명했습니다. 서버 쪽 기능으로는 기본적으로 구현되는 XML 저장소, 인덱싱 및 쿼리 처리가 있습니다. 또한 FOR XML 및 OpenXML과 같은 기존 기능도 향상되었습니다. 클라이언트 쪽에서는 XML 데이터 형식을 지원하기 위해 ADO.NET이 향상되었으며 SQLXML 매핑 기술 웹 릴리스 향상이 SQL Server 2005에 통합되었습니다.

서버 쪽 및 클라이언트 쪽 지원은 다양한 시나리오에서 유용하게 사용됩니다. XML 데이터 형식은 XML 데이터를 형식없는 XML 열에 삽입하여 XML 데이터를 저장하는 간단한 메커니즘을 제공합니다. XML 스키마를 사용하여 형식있는 XML을 정의하면 데이터베이스에서 데이터 유효성 검사를 제공하는 것 외에도 저장소 및 쿼리 처리를 최적화할 수 있습니다.

XML 데이터 형식은 문서 순서를 유지하므로 문서 관리와 같은 작업에 유용합니다. 또한 XML 데이터 형식은 재귀적 XML 스키마를 처리할 수 있습니다. 스키마가 알려진 구조적 데이터에서는 여전히 관계형 데이터 모델이 최선의 방법입니다. 정교한 쿼리와 업데이트가 중요하지 않은 상황에서는 [n]varchar(max)가 적합합니다.

서버의 테이블에 저장된 관계형 데이터에 대해 XML 중심 프로그래밍 모델을 사용하려는 경우 SQLXML 매핑 기술이 유용하게 사용됩니다. XML 스키마를 XML 뷰로 정의하는 작업에 기초하여 매핑이 수행됩니다. XML 데이터를 테이블로 대량 로드하고 XPath 1.0을 사용하여 테이블을 쿼리하기 위해 매핑을 사용할 수 있습니다. 문서 순서가 유지되지 않으므로 매핑 기술은 XML 문서 처리가 아니라 XML 데이터 처리에 유용합니다.

.NET Framework V2.0 릴리스에 있는 System.Xml의 핵심 XML 클래스를 사용하면 XML 읽기, 쓰기, 조작 및 변환을 수행할 수 있습니다. 향상된 성능, 유용성, 형식화 및 쿼리를 통해 V2.0 릴리스의 XML 지원은 업계 제일의 혁신적인 기능, 표준 지원 및 사용 편의성을 지속적으로 제공합니다.

서버 쪽 기술과 클라이언트 쪽 기술은 상호 보완적입니다. 매핑 기술은 서버 쪽 기능을 활용하여 문서 순서 유지 및 재귀적 스키마와 같은 기능을 구현함으로써 더 많은 영역에 적용될 수 있습니다. 반면, CLR은 XSLT 변환과 같은 풍부한 기존 XML 도구와 확장성을 XML 데이터 형식에 제공합니다. 서버의 XQuery 쿼리 구현은 2004년 7월에 발표된 XQuery 사양 초안에 기반을 두고 있습니다. 서버와 클라이언트에서의 XML 스키마 구현은 서로 연계되어 있습니다.

참조

[1] S. Pal, V. Parikh, V. Zolotov, L. Giakoumakis, M. Rys. Microsoft SQL Server 2005를 위한 XML 최적 방법sql25xmlbp. http://msdn.microsoft.com/xml/default.aspx?pull=/library/en-us/dnsql90/html/sql25xmlbp.asp

[2] S. Pal, I. Cseri, O. Seeliger, G. Schaller, L. Giakoumakis, V. Zolotov. 관계형 데이터베이스에 저장된 XML 데이터 인덱싱. http://www.vldb.org/conf/2004/IND5P2.PDF (영문).

[3] Microsoft SQL Server 2005의 XML 옵션sqlsql2k5xmloptions. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsql90/html/sql2k5xmloptions.asp.

[4] M. Rys. Microsoft SQL Server 2005 FOR XML의 새로운 기능.

Shankar Pal은 SQL Server 엔진의 프로그램 관리자이며 서버 쪽 XML 기술을 다루고 있습니다. 블로그 주소는 http://blogs.msdn.com/spal (영문)입니다.

Mark Fussell은 WebData 팀의 수석 프로그램 관리자이며 .NET Framework의 System.Xml 및 System.Data 네임스페이스에 있는 구성 요소, MSXML(Microsoft XML Core Services), MDAC(Microsoft Data Access Components) 등을 비롯한 Microsoft 데이터 액세스 기술을 개발합니다. 블로그 주소는 http://weblogs.asp.net/mfussell (영문)입니다.

Irwin Dolobowsky는 WebData 팀의 프로그램 관리자입니다.



제공 : DB포탈사이트 DBguide.net

출처명: 한국마이크로소프트

728x90

SQL Server 2005의 XQuery 소개



Prasadarao K. Vithanala - Microsoft Corporation


요약: 이 백서에서는 FLWOR 문, XQuery의 연산자, if-then-else 구문, XML 생성자, 기본 제공되는 XQuery 함수, 형식 캐스팅 연산자, 이러한 각 기능을 사용하는 방법에 관한 예제 등을 비롯하여 SQL Server 2005에서 구현된 XQuery의 다양한 기능을 소개합니다. 또한 SQL Server 2005에서 지원되지 않는 XQuery 기능과 해결 방법이 설명되고 XQuery가 유용하게 사용되는 세 가지 시나리오가 제공됩니다.


목차

소개
SQL Server 2005의 XML 데이터 형식
XQuery 소개
XQuery 식 구조
XQuery의 연산자
if-then-else 구문
XQuery를 사용하여 XML 생성
기본 제공 XQuery 함수
형식 관련 식
관계형 열과 변수 액세스
지원되지 않는 기능과 해결 방법
최상의 실행 방법 및 지침
XML 데이터 수정
XQuery 사용 시나리오
결론




소 개


XML은 문서 형식으로 사용하도록 개발되었습니다. 그러나 확장성, 국제화 지원, 구조적 및 반구조적 데이터 표시 기능, 시스템 및 사용자를 위한 향상된 가독성 등을 비롯한 추가 기능으로 인해 XML은 플랫폼에 독립적인 데이터 표현 형식으로 매우 널리 사용되고 있습니다. XML이 널리 보급됨에 따라 사용자들은 데이터 통합과 관련된 문제와 같은 복잡한 비즈니스 문제를 해결하기 위해 XML을 적용하고 있습니다.


많은 시나리오에서 정보를 테이블에 저장한 다음 해당 정보에서 XML 메시지를 작성하는 것보다는 정보를 XML 형식으로 저장하는 것이 권장됩니다. 이러한 시나리오에 대한 자세한 내용은 MSDN 기사 Microsoft SQL Server 2005를 위한 XML 최상의 실행 방법을 참조하십시오. 문서를 저장하고 반구조적 데이터를 표현하기 위해 XML을 적용하는 방법은 서버의 데이터 관리를 단순화하는 데이터 저장 형식으로 XML이 발전하게 된 원동력이 되어 왔습니다.


그러나 관계형 테이블에 저장된 XML 데이터에서 정보를 BLOB로 추출하려면 정보를 추출하여 XML로 표현할 수 있는 쿼리 언어가 필요하다는 문제가 대두되었습니다. Microsoft SQL Server 2000에서는 쿼리에 사용할 수 있는 OpenXML이 제공되었습니다. 그러나 OpenXML은 XML 데이터를 관계형 형식에 매핑하도록 설계되었기 때문에 XML 데이터 모델을 완전하게 지원하지 못했습니다(표 1 참조).


관계형 데이터 모델과 XML 데이터 모델은 여러 측면에서 다릅니다. 다음 표에는 두 데이터 모델의 주요 차이점이 나와 있습니다.


관계형 데이터 모델이 XML 문서를 기본적으로 저장하도록 확장되는 것은 여러 요인 중에서 특히 유형이 다른 구조적 데이터를 더 많이 처리해야 하는 요구가 커지고 암시적 순서를 유지해야 할 필요성이 증가했기 때문입니다. 또한 반구조적 또는 태그 정보 처리에 관한 SQL 언어의 한계로 인해 XQuery 언어가 개발되었습니다. XQuery 언어는 XML 데이터의 특성과 XML 데이터 처리와 관련된 문제를 고려하여 처음부터 새롭게 디자인되었습니다.


SQL Server 2005에서는 XML데이터 형식을 사용한 XML 데이터의 네이티브 저장이 기본적으로 지원됩니다. XQuery 1.0은 XML 데이터에 대한 쿼리를 공식화하기 위해 W3C(World Wide Web Consortium) XML Query Working Group에서 정의한 언어입니다. SQL과 마찬가지로 XQuery는 SQL 및 Xpath에 대한 기본 지식만으로 쉽게 이해할 수 있는 선언적 쿼리 언어입니다.

표 1 관계형 데이터 모델과 XML 데이터 모델의 차이점

기 능 관계형 데이터 모델 XML 데이터 모델
평면 구조적 데이터 평면 테이블을 사용하여 데이터를 열 형식으로 저장합니다. 평면 구조적 데이터를 저장하는 데 권장되는 방법입니다. 문서 순서를 유지해야 하거나 스키마가 유연하거나 알려지지 않은 경우 유용합니다.
반구조적 데이터 관계형 모델을 사용하여 반구조적 데이터를 모델링하는 것이 어렵습니다. 변수 또는 확장 스키마를 사용하여 반구조적 데이터를 표현할 수 있는 기능을 지원합니다.
태그 데이터 BLOB 저장소를 벗어나 태그 데이터를 저장하는 데 적합하지 않습니다. HTML, RTF 등과 같은 태그 데이터를 저장할 수 있는 기능을 지원합니다.
중첩 또는 계층 데이터 구조 외래 키로 여러 테이블을 연결하여 사용함으로써 중첩 데이터를 지원하지만 중첩 깊이가 증가하거나 알려지지 않은 경우에 관계형 형식으로 저장된 중첩 데이터를 검색하는 데 필요한 쿼리가 복잡해집니다. 중첩 또는 계층 데이터 구조를 표현할 수 있는 기능을 지원합니다.
데이터 순서 유지되지 않습니다. 유지됩니다.
입력 데이터 유형이 같습니다. 유형이 다릅니다.
결과 집합 유형이 같습니다. 유형이 다릅니다.


이 문서는 2004년 7월에 발표된 XQuery 초안에 기초하는 SQL Server 2005의 XQuery 1.0 구현을 기반을 두고 있습니다. 이 문서의 첫 번째 절에서는 새 XML 데이터 형식과 관련 기능에 대한 개요를 제공합니다. 뒤이어 나오는 절에서는 새 XQuery 언어와 이점, FLWOR 문, XQuery의 다양한 연산자, XQuery의 기본 제공 함수, 형식 관련 식, SQL Server 2005에서 지원되지 않는 기능 등을 소개합니다. 마지막 부분의 절에서는 최상의 실행 방법과 지침, XML 데이터 수정 및 XQuery 사용 시나리오를 제공합니다.



SQL Server 2005의 XML 데이터 형식


SQL Server 2005에서 소개된 새 XML 데이터 형식은 XML 문서와 단편을 데이터베이스에 저장할 수 있는 기능을 사용자에게 제공합니다. XML 데이터 형식을 사용하면 열, 저장 프로시저 또는 함수의 매개 변수, 변수 등을 만들 수 있습니다.


또한 사용자는 XML 형식 열을 XML 스키마 컬렉션과 연관시켜 형식 있는 XML 열을 만들 수 있습니다. 컬렉션의 XML 스키마는 XML 인스턴스의 유효성을 검사하고 형식화하는 데 사용됩니다.



형식 있는/형식 없는 XML 데이터 형식 비교


XML 데이터 형식을 XML 스키마 컬렉션과 연관시켜 XML 인스턴스에 스키마 제약 조건을 적용할 수 있습니다. XML 데이터가 XML 스키마 컬렉션과 연관된 경우 이를 형식 있는 XML이라고 부르고 그렇지 않은 경우 형식 없는 XML이라고 부릅니다.


SQL Server 2005 XML 데이터 형식은 ISO SQL-2003 표준 XML 데이터 형식을 구현합니다. 따라서 올바른 형식의 XML 1.0 문서뿐만 아니라 최상위 텍스트 노드와 임의 개수의 최상위 요소가 포함된 소위 XML 콘텐츠 단편도 저장할 수 있습니다. 데이터가 올바른 형식을 가지는지 검사되며(XML 데이터 형식이 XML 스키마에 바인딩될 필요는 없음) SQL-2003 콘텐츠 완화법에 따라 올바른 형식이 아닌 데이터는 거부됩니다.


스키마가 미리 알려지지 않은 경우에 형식 없는 XML이 유용합니다. 또한 스키마가 알려져 있지만 변경 속도가 빨라서 유지 관리하기 힘들거나 여러 스키마가 존재하며 외부 요구 사항에 기초하여 이러한 스키마가 나중에 데이터에 바인딩될 경우에 형식 없는 XML이 유용합니다. 이외에도 데이터베이스 엔진이 지원하지 않은 XML 스키마 구문(예: key/keyref, lax validation)이 XML 스키마에 포함된 경우에도 형식 없는 XML이 유용합니다. 이 경우 CLR(Common Language Runtime) 사용자 정의 함수에서 System.XML 유효성 검사기를 사용하여 유효성 검사를 제공할 수 있습니다.


XML 스키마 컬렉션에 XML 데이터를 설명하는 XML 스키마가 있을 경우 XML 스키마 컬렉션을 XML 열과 연관시켜 형식 있는 XML을 생성할 수 있습니다. XML 스키마는 데이터의 유효성을 검사하고 쿼리 및 데이터 수정 문의 컴파일 도중에 형식 없는 XML보다 정확한 형식 검사를 수행하며 저장소 및 쿼리 처리를 최적화하는 데 사용됩니다.


형식 있는 XML 열, 매개 변수 및 변수는 선언 시에 옵션으로 지정할 수 있는 XML 문서나 콘텐츠 단편을 저장할 수 있습니다(각각 DOCUMENT 또는 CONTENT 옵션으로 지정할 수 있으며 기본값은 CONTENT). 또한 XML 스키마 컬렉션을 제공해야 합니다. 각 XML 인스턴스에 정확하게 하나의 최상위 요소가 있을 경우 DOCUMENT를 지정하고 그렇지 않을 경우에는 CONTENT를 사용합니다. XQuery 컴파일러는 DOCUMENT 플래그 정보를 사용하여 정적 형식 유추 도중에 단일 최상위 요소를 유추합니다.



XML 데이터 형식의 메서드


XML 데이터 형식은 XML 인스턴스를 조작하는 데 사용할 수 있는 5개의 메서드를 지원합니다. XML 데이터 형식의 이러한 메서드는 다음과 같습니다.


query() 메서드는 XML 노드 목록으로 평가되는 XQuery 식을 가집니다. 이 메서드를 사용하면 XML 문서의 단편을 추출할 수 있습니다. 형식 없는 XML의 인스턴스가 결과로 반환됩니다.


value() 메서드는 XML 문서에서 스칼라 값을 관계형 값으로 추출하는 데 사용됩니다. 이 메서드는 단일 노드와 반환되는 원하는 SQL 형식을 식별하는 XQuery 식을 가집니다. XML 노드 값이 반환되어 지정된 SQL 형식으로 캐스팅됩니다.


exist() 메서드를 사용하면 XML 문서에서 검사를 수행하여 XQuery 식의 결과가 비어 있는지 여부를 확인할 수 있습니다. XQuery 식이 비어 있지 않은 결과를 반환하면 이 메서드의 결과는 1입니다. 결과가 비어 있으면 0이고 XML 인스턴스 자체가 NULL이면 결과도 NULL입니다.


XML 데이터 형식의 nodes() 메서드는 XML 문서를 관계형 데이터로 분해하는 작업을 용이하게 합니다. nodes() 메서드는 제공된 XQuery 식에서 식별하는 컨텍스트 노드를 각 행에서 나타내는 행 집합을 반환합니다. 또한 query(), value(), exist(), nodes() 등과 같은 XML 데이터 형식의 메서드를 nodes() 메서드에서 반환된 컨텍스트 노드에서 호출할 수 있습니다.


modify() 메서드를 사용하면 XML 문서의 내용을 수정할 수 있습니다. 이 메서드는 XML DML 문을 사용하여 XML 인스턴스에서 하나 이상의 노드를 삽입, 업데이트 또는 삭제합니다. NULL 값에 적용될 경우 오류가 발생합니다.


자세한 내용은 Microsoft SQL Server 2005의 XML 지원 백서를 참조하십시오.



XQuery 소개


XQuery는 XML 데이터를 쿼리하기 위한 새 언어이며 XPath 2.0에 기초한 탐색 액세스를 허용합니다. 이 절에서는 XQuery와 Xpath의 관계, XQuery를 사용할 경우의 이점, XQuery의 적용 영역, XQuery에서 XML 스키마의 역할 등을 비롯하여 XQuery 언어의 다양한 측면에 대한 개요를 제공합니다.



XPath 2.0 개요


W3C에 의해 정의된 XPath 1.0 (영문)은 XML 문서의 일부분을 찾기 위한 언어입니다. Xpath는 XML 문서에서 노드를 식별하기 위해 경로 기반 구문을 사용합니다. 또한 Xpath는 XSLT 1.0 (영문) 및 XPointer (영문)에 대한 핵심 구문을 정의합니다. XPath 1.0에는 문자열, 부울 값 및 부동 소수점 수를 처리하기 위한 기본 제공 함수가 있습니다. XPath 1.0은 필터링 기준을 지정하는 기능과 함께 노드 집합을 필터링하기 위한 구문을 정의합니다. 더 자세한 형식 시스템을 지원하고 더 많은 기능을 제공하기 위해 XPath 1.0은 XPath 2.0 (영문)으로 확장되고 있습니다. XQuery 1.0 (영문)은 XPath 2.0에 기반을 두며 XPath 2.0의 탐색 및 필터링 측면에 순서 지정, 형태 변경, 구성 및 유효성 검사 기능을 추가합니다.



XQuery 개요


XQuery는 XML 형식으로 저장된 데이터를 쿼리하려는 특별한 목적을 위해 XML Query Working Group에 의해 처음부터 새로 설계된 형식 있는 선언적 기능 언업니다. XQuery는 XPath 2.0 및 XSLT 2.0 (영문)과 같은 다른 XML 표준과 동일한 데이터 모델 및 XML 스키마 (영문) 기반 형식 시스템을 사용합니다. XQuery는 형식화되지 않았거나(즉, 데이터와 연관된 스키마가 없는) XML 스키마로 형식화된 XML 문서에서 작동하도록 설계되었습니다. 앞에서 언급한 것처럼 XQuery 1.0은 기본적으로 XPath 2.0의 상위 집합입니다. XPath 2.0의 기능 외에도 다음과 같은 기능이 있습니다.


* 문서 순서와 다른 순서로 정렬할 수 있도록 FLWOR 절에 order by 절을 추가합니다.

* 이후에 사용하기 위해 식 결과에 이름을 지정하기 위해 FLWOR 절에 let 절을 추가합니다(SQL Server 2005에서는 지원되지 않음).

* 쿼리 프롤로그에 정적 컨텍스트 항목을 지정하는 방법을 제공합니다(예: 네임스페이스 접두사 바인딩).

* 새 노드를 생성하는 기능을 제공합니다.

* 사용자 정의 함수를 정의하는 기능을 제공합니다(SQL Server 2005에서는 지원되지 않음).

* 모듈/라이브러리를 만드는 기능을 제공합니다(SQL Server 2005에서는 지원되지 않음).



XQuery의 이점


* SQL 및 Xpath에 대한 지식이 있는 경우 쉽게 배울 수 있습니다.

* 쿼리가 XQuery로 작성된 경우 XSLT로 작성된 쿼리보다 코드가 적게 필요합니다.

* XML 데이터가 형식화된 경우 XQuery를 강력한 형식의 언어로 사용할 수 있으며 이 경우 암시적 형식 캐스트를 방지하여 쿼리의 성능을 향상시키고 쿼리 최적화 수행 시에 사용할 수 있는 형식 보장을 제공할 수 있습니다.

* 형식 없는 데이터의 경우 높은 유용성을 제공하기 위해 Xquery를 약한 형식의 언어로 사용할 수 있습니다. SQL Server 2005는 강력한 형식 및 약한 형식 관계에 대한 지원을 사용하여 정적 형식 유추를 구현합니다.

* XQuery는 쿼리를 수행하는 데 필요한 코드가 XSLT보다 적기 때문에 유지 관리 비용이 적게 들어갑니다.

* XQuery는 W3C 권고가 되어가고 있으며 주요 데이터베이스 공급업체에 의해 지원될 것입니다.


이 문서를 작성할 시점에 XQuery 1.0 언어와 관련하여 다음과 같은 주의 사항이 있었습니다.

XQuery 사양은 현재 개발 중이며 이후에 변경될 수 있습니다. SQL Server 2005는 W3C 초안의 검증된 부분에 기반을 두고 구현되었습니다.



XQuery 적용 영역


XQuery의 적용 영역을 다음과 같이 넓게 구분할 수 있습니다.


* 쿼리/분석을 위한 XQuery : XQuery는 많은 양의 데이터를 쿼리하는 데 적합하며 필요한 정보를 필터링, 정렬, 순서 지정 및 재활용하는 기능을 제공합니다. 반구조적 정보를 나타내는 XML 문서, 이름/값 쌍 속성 모음, 잠재적 응용 프로그램 오류와 보안 문제를 식별하기 의한 응용 프로그램 로그, 트랜잭션 로그 및 감사 로그 분석 등을 쿼리하는 것을 일반적인 적용 예로 들 수 있습니다.


* 응용 프로그램 통합을 위한 XQuery : 많은 조직에서 독자적인 응용 프로그램 통합 접근 방법에서 벗어나 표준 기반의 응용 프로그램 통합 접근 방법을 채택하기 시작함에 따라 내부 응용 프로그램 특정 형식의 데이터를 표준 교환 형식으로 변환해야 하는 필요성이 중요해지고 있습니다. XML 데이터를 생성 및 변환하는 기능을 가진 XQuery는 이러한 요구를 충족합니다. 응용 프로그램 통합 영역에서 XQuery가 사용되는 일반적인 예로 네이티브 XML 데이터베이스/관계형 데이터 데이터 소스를 사용하는 특정 응용 프로그램에 사용되는 용어를 XML/관계형 데이터 형식을 사용하는 다른 응용 프로그램에 사용되는 언어로 변환하는 경우를 들 수 있습니다.



서버에서 XQuery를 사용할 경우의 이점


XQuery를 사용하여 서버에서 XML 처리를 수행하는 것은 클라이언트 쪽 XML 처리와 비교하여 많은 이점이 있습니다. 그 중에서 몇 가지 이점을 요약하면 다음과 같습니다.


* 네트워크의 트래픽 감소 :
XML 데이터가 서버에서 처리될 경우 결과만 클라이언트에게 전달됩니다. 결과적으로 네트워크에서 트래픽이 줄어듭니다.

* 보안 향상: 필요한 데이터만 클라이언트에게 보내지므로 클라이언트 쪽 XML 처리를 사용할 경우처럼 전체 데이터가 네트워크에 노출되는 위험이 방지됩니다.

* 향상된 관리 효율성 :
서버에서 XML을 처리하므로 클라이언트에서 코드가 브라우저에 독립적입니다. 결과적으로 클라이언트 쪽에서 관리 효율성이 향상됩니다.

* 향상된 성능 :
서버에서 XQuery를 사용하여 작성하는 쿼리는 SQL 쿼리 엔진의 최적화를 따릅니다. 따라서 클라이언트에서 전체 데이터를 검색하고 필터링할 때와 비교하여 성능이 향상됩니다. 또한 XML 데이터 형식 열에서 인덱스를 작성하여 성능 향상을 실현할 수 있습니다.



XQuery 구현에서 XML 스키마가 사용되는 방법


XML 데이터 형식과 연관된 XML 스키마 컬렉션은 다음과 같이 관계형 엔진에 사용됩니다.


* 삽입 작업 도중에 XML 인스턴스의 유효성을 검사하기 위해 사용됩니다.

* 수정 작업 도중에 XML 인스턴스의 유효성을 검사하기 위해 사용됩니다.

* 더 나은 쿼리 계획을 생성하고 많은 런타임 검사를 방지하여 오류를 조기에 감지하고 쿼리 성능을 향상시키기 위해 정적 형식 검사 도중에 XML 스키마에 포함된 형식 정보가 사용됩니다.

* SQL Server는 XML 스키마에 존재하는 형식 정보를 사용하여 저장소를 최적화합니다.



XQuery 식 구조


SQL Server 2005의 XQuery 식은 두 개의 섹션, 즉 프롤로그와 본문으로 구성됩니다. 프롤로그에는 네임스페이스 선언 하위 섹션이 포함될 수 있습니다. 네임스페이스 선언은 접두사와 네임스페이스 URI 간의 매핑을 정의하는 데 사용되므로 쿼리 본문에서 네임스페이스 URI 대신에 접두사를 사용할 수 있게 합니다. 또한 declare default namespace 선언을 사용하여 요소 이름에 대한 기본 네임스페이스를 바인딩하면 접두사 없이 요소 이름을 참조할 수 있습니다.


XQuery 식의 본문에는 쿼리의 결과를 정의하는 쿼리 식이 포함됩니다. 예를 들어, 본문은 서명 FLWOR 식(이 문서의 FLWOR 문 참조), XPath 2.0 식(이 문서의 XPath 2.0 식 참조) 또는 생성 식이나 산술 식과 같은 다른 XQuery 식이 될 수 있습니다.


예제: XQuery의 프롤로그 섹션에 기본 네임스페이스 지정


다음 쿼리는 JobCandidateID가 3인 후보의 모든 Employment 노드를 선택합니다. 이 쿼리는 기본 네임스페이스를 정의하며 네임스페이스 접두사가 사용되지 않습니다.


SELECT Resume.query(''
declare default namespace "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
/Resume/Employment
'') as Result
FROM [HumanResources].[JobCandidate]
WHERE JobCandidateID = 3


예제: "WITH XMLNAMESPACES" 절을 사용하여 네임스페이스 지정


또한 SQL Server는 사용자가 SQL 쿼리 단위로 SQL WITH 절에서 XML 네임스페이스 바인딩을 선언할 수 있게 하는 SQL 2003 표준 확장을 지원합니다. 따라서 여러 XML 데이터 형식 메서드 호출에서 선언을 반복할 필요가 없습니다. 다음 쿼리는 앞 예제에 나온 쿼리의 수정된 버전을 보여 줍니다. 이 쿼리는 WITH XMLNAMESPACES 절을 사용하여 네임스페이스를 선언합니다.


WITH XMLNAMESPACES( ''http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume'' AS "RES")
SELECT Resume.query(''
/RES:Resume/RES:Employment
'') as Result
FROM [HumanResources].[JobCandidate]
WHERE JobCandidateID = 3



XPath 2.0 식


XQuery는 XPath 2.0 식을 사용하여 문서의 노드를 찾고 단일 문서나 여러 문서의 특정 위치에서 다른 위치로 탐색합니다. Xpath를 사용하여 정의하는 탐색 경로는 /로 구분된 일련의 단계로 구성됩니다. 단일 단계는 축, 노드 테스트 및 0개 이상의 단계 한정자로 구성됩니다.


축은 컨텍스트 노드를 기준으로 이동 방향을 지정합니다. SQL Server 2005에서 지원되는 축은 child, descendant, parent, attribute, self 및 descendant-or-self입니다.


노드 테스트는 단계에서 선택된 모든 노드가 충족해야 하는 조건을 지정합니다. 노드 이름이나 노드 유형에 기초하여 노드 조건을 지정할 수 있습니다.


단계 한정자는 조건자 또는 역참조를 사용하여 정의할 수 있습니다. 조건자는 노드 시퀀스에서 필터로 작동하고 대괄호 안에 지정되는 식입니다. 역참조는 노드 시퀀스의 요소 및/또는 특성을 참조되는 노드에 매핑합니다. 역참조에 입력으로 전달되는 노드 시퀀스는 IDREF 또는 IDREFS 형식의 요소나 특성을 포함해야 합니다. 역참조는 입력 시퀀스의 요소 및 특성에서 추출된 IDREF 값과 일치하는 ID 형식 특성 값을 가지는 요소 노드로 구성된 새 시퀀스를 생성합니다.


Xpath 식의 단계는 왼쪽에서 오른쪽으로 평가됩니다. 단계가 실행되면 다음 단계의 평가 컨텍스트 항목이 설정됩니다. 경로 식의 컨텍스트 항목은 Xpath 식의 단계가 실행된 결과로 선택된 노드입니다. 단계는 이전 단계에서 얻어진 컨텍스트 항목을 기준으로 평가됩니다. XPath 식의 결과는 경로 식에서 왼쪽에서 오른쪽으로 모든 단계를 순서대로 실행한 후에 얻어진 문서 순서를 따르는 노드 시퀀스입니다.


다음 예제 식은 경로 식의 개념을 보여 주기 위해 AdventureWorks 데이터베이스의 [HumanResources].[JobCandidate] 테이블에서 XML 형식의 Resume 열을 사용합니다. 이 경로 식에서는 주소 형식이 Home으로 설정된 모든 주소 노드가 선택됩니다.


//child::ns:Addr.Type[.="Home"]/parent::node()


위 경로 식에서

    child는 축 지정자입니다.

    ::은 축 구분자입니다.

    ns는 네임스페이스 접두사입니다.

    Addr.Type은 노드 테스트입니다.

    [.="Home"]은 조건자 식이며 .은 컨텍스트 노드를 나타냅니다.

또한 XQuery는 축을 지정하기 위한 축약 구문을 지원합니다. 다음 표에는 축과 해당 축약 구문이 나와 있습니다.



표 2 축의 축약 구문






축약 형식
Attribute @
Child  
descendant-or-self::node() //
parent::node() ..
self::node() .

예제: 고용 기록에서 조직 이름 선택


다음 XPath 식은 Resume/Employment 노드의 자식 노드인 Emp.OrgName 요소의 자식 텍스트 노드를 선택합니다. 여기서 Emp.OrgName 요소의 텍스트 노드를 선택하기 위해 text()가 사용됩니다.


/Resume/Employment/Emp.OrgName/text()



FLWOR 문


FLWOR 문은 XQuery의 핵심 식이며 SQL의 SELECT 문과 비슷합니다. "flower"라고 발음되는 머리 글자어 FLWOR는 FOR, LET, WHERE, ORDER BY, RETURN을 나타냅니다. XQuery의 FLWOR 식을 사용하면 선언적 반복, 변수 바인딩, 결과 필터링, 정렬 및 반환 등과 같은 작업을 지정할 수 있습니다. SQL Server 2005에서는 FOR, WHERE, ORDER BY 및 RETURN이 지원됩니다.



For


FLWOR 식의 for 절을 사용하면 입력 시퀀스에서 바인딩된 변수의 선언적 반복을 정의할 수 있습니다. XPath 식, 원자 값 시퀀스, 리터럴을 사용하여 생성된 시퀀스, 생성자 함수 등을 사용하여 입력 시퀀스를 지정할 수 있습니다. 따라서 SQL SELECT FROM 절과 비슷하지만 프로그래밍 언어 "for" 구문과는 다릅니다.


또한 변수 바인딩이 for 절에 지정됩니다.


예제: for 절을 사용하여 이력서에서 모든 집 주소 요소 선택


다음 쿼리는 주소 형식이 Home으로 설정되었으며 JobCandidateID가 3인 모든 Address 노드를 선택합니다.


SELECT Resume.query(''
declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
for $A in /RES:Resume/RES:Address/RES:Addr.Type[.="Home"]/..
return
$A
'') as Result
FROM [HumanResources].[JobCandidate]
WHERE JobCandidateID = 3



where


where 절은 where 절을 사용하여 지정된 식을 적용하여 반복 결과를 필터링합니다.


예제: where 절을 사용하여 모든 집 주소 요소 선택


다음 쿼리는 주소 형식이 Home으로 설정되었으며 JobCandidateID가 3인 모든 Address 노드를 선택합니다.


SELECT Resume.query(''
declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
for $A in /RES:Resume/RES:Address
where $A/RES:Addr.Type[.="Home"]
return
$A
'') as Result
FROM [HumanResources].[JobCandidate]
WHERE JobCandidateID = 3



order by


order by 키워드를 사용하면 반환된 결과 집합에서 값을 정렬할 수 있습니다. order by 키워드에는 원자 값을 반환해야 하는 정렬 식이 허용됩니다. 원하는 경우 오름차순 또는 내림차순 정렬 순서를 지정할 수도 있습니다. 기본 정렬 순서는 오름차순입니다.


예제: order by 절을 사용하여 고용 기록을 오름차순으로 선택


다음 쿼리는 JobCandidateID가 3인 후보에 대해 고용 시작 날짜의 오름차순으로 모든 Employment 노드를 선택합니다.


SELECT Resume.query(''
declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
for $EMP in /RES:Resume/RES:Employment
order by $EMP/RES:Emp.StartDate
return
$EMP
'') as Result
FROM [HumanResources].[JobCandidate]
WHERE JobCandidateID = 3



return


SQL의 SELECT 절과 비슷한 return 절을 사용하면 쿼리 결과를 정의할 수 있습니다. 모든 유효한 XQuery 식을 return 절에 지정할 수 있습니다. 또한 요소, 특성 등에 대한 생성자를 지정하여 return 섹션에서 XML 구조를 생성할 수 있습니다.


예제: return 절을 사용하여 고용 기록의 특정 요소 선택


다음 쿼리는 JobCandidateID가 3인 후보에 대해 Employment 노드의 StartDate, EndDate, OrgName, JobTitle 요소를 선택합니다.


SELECT Resume.query(''
declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
for $EMP in /RES:Resume/RES:Employment
order by $EMP/RES:Emp.StartDate
return

{ $EMP/RES:Emp.StartDate }
{ $EMP/RES:Emp.EndDate }
{ $EMP/RES:Emp.OrgName }
{ $EMP/RES:Emp.JobTitle }

'') as Result
FROM [HumanResources].[JobCandidate]
WHERE JobCandidateID = 3


현재 SQL Server 2005에서 구현된 XQuery는 let 절을 지원하지 않습니다. 이에 대한 자세한 내용은 이 문서의 뒤에 나오는 지원되지 않는 기능 및 해결 방법 부분에서 설명합니다.



FLWOR 식 및 XPath 식 비교


XPath 식을 사용하여 결과 시퀀스를 표현할 수 있는 경우 FLWOR 식을 사용하여 결과 시퀀스를 정의하면 성능이 저하됩니다. 이는 쿼리 계획에서 for 절의 본문과 for 변수 사이에 JOIN 작업이 포함되어 있기 때문입니다. 다음 조건 중 하나 이상을 충족할 경우에만 FLWOR 식을 사용하기에 적합합니다.


식 결과로 반환되는 값 시퀀스를 반복하려는 경우. 결과 집합의 연속된 값에 변수를 바인딩하는 for 절을 사용하여 이 작업을 수행합니다. for 절의 범위 내에서 새 요소를 생성하고 중복 요소를 유지하는 것을 예로 들 수 있습니다.
간단한 XPath 식을 사용하여 정의할 수 없는 조건자에 기초하여 for 절의 결과 집합을 필터링하려는 경우. 결과 집합에서 원치 않는 값을 제거하기 위해 where 절이 사용됩니다. 예를 들면 다음과 같습니다.


DECLARE @Result xml
SET @Result = ''''
SELECT @Result.query(''
for $i in (1, 2, 3), $j in (3, 4, 5)
where $i < $j
return sum($i + $j)
'') as Result


정렬 식에 기초하여 결과 집합을 정렬하려는 경우. order by 절을 사용하여 결과 집합에서 정렬을 정의합니다.
for 절에서 얻은 결과를 사용하여 반환된 결과 집합의 형태를 정의하려는 경우. 결과 집합의 형태 정의를 수행하기 위해 return 문이 사용됩니다.
다른 모든 경우에는 XPath 식을 사용하는 것이 좋습니다.



XQuery의 연산자


기능적 언어인 SQL Server 2005의 XQuery는 다음 범주로 그룹화할 수 있는 다양한 유형의 함수와 연산자를 지원합니다.

  • 산술 연산자

  • 비교 연산자

  • 논리 연산자

    표 3 SQL Server 2005에서 지원되는 연산자

    유형 연산자
    산술 연산자 +,-,*,div, mod
    일반 비교 연산자 =, !=, <, >, <=, >=
    값 비교 연산자 eq, ne, lt, gt, le, ge
    노드 비교 연산자 is
    노드 순서 비교 연산자 >>, <<
    논리 연산자 and, or


    산술 연산자


    SQL Server 2005에서는 5개의 산술 연산자인 +, b, *, div 및 mod가 지원됩니다. 현재 idiv는 지원되지 않습니다.

    예제: 상점 조사 정보의 선택된 값 변환


    다음 쿼리는 AdventureWorks 데이터베이스의 [Sales].[Store] 테이블에 기초합니다. 이 쿼리는 CustomerID가 3인 상점의 AnnualSales 및 AnnualRevenue 값을 엔화로 반환하고 상점 면적을 평방 미터로 반환합니다.


    SELECT Demographics.query(''
    declare namespace ST="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey";
    for $S in /ST:StoreSurvey
    return
    SalesInYen ="{ $S/ST:AnnualSales*106.8100 }"
    RevenueInYen = "{ $S/ST:AnnualRevenue*106.8100 }"
    StoreAreaInSqMeters = "{ $S/ST:SquareFeet*0.0929 }">

    '') as Result
    FROM [Sales].[Store]
    WHERE CustomerID = 3



    비교 연산자


    SQL Server 2005에서는 네 가지 유형의 비교 연산자가 지원됩니다. 이러한 연산자는 일반 비교 연산자, 값 비교 연산자, 노드 비교 연산자 및 노드 순서 비교 연산자입니다.



    일반 비교 연산자


    일반 비교 연산자를 사용하면 원자 값 또는 시퀀스나 이러한 두 값의 조합을 비교할 수 있습니다. 일반 비교 연산자는 =, !=, <, >, <=, 및 >=입니다. 일반 비교는 존재 여부를 수량화되는데 이는 일치하는 항목이 있을 경우 true가 반환된다는 것을 의미합니다.


    예제: 주소 형식이 Home으로 설정되지 않은 모든 주소 요소 선택


    다음 쿼리는 주소 형식이 Home으로 설정되지 않았으며 JobCandidateID가 3인 모든 Address 노드를 선택합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $A in /RES:Resume/RES:Address
    where $A/RES:Addr.Type[.!="Home"]
    return
    $A
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3



    값 비교 연산자


    값 비교 연산자를 사용하면 원자 값을 비교할 수 있습니다. SQL Server 2005에서 지원되는 값 비교 연산자는 eq, ne, lt, gt, le, 및 ge입니다. 현재의 XQuery 구현은 형식 없는 원자 값 승격과 관련하여 2004년 7월 발표된 XQuery 사양 초안을 따릅니다. 형식 없는 원자 형식은 XQuery 사양에 지정된 대로 xs:string 대신에 다른 피연산자 형식으로 승격됩니다. 이는 값 비교를 전이적인 것으로 만드는 것보다 일반 및 값 비교 연산자 사이에서 일관성을 유지하는 것이 더 중요하다고 간주되기 때문입니다.


    예제: GPA가 3.5보다 큰 모든 education 요소 선택


    다음 쿼리는 JobCandidateID가 2인 후보에 대해 GPA가 3.5보다 큰 모든 Education 노드를 선택합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $ED in /RES:Resume/RES:Education
    where xs:decimal($ED/RES:Edu.GPA) gt 3.5
    return
    $ED
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2



    노드 비교 연산자


    노드 비교 연산자 is를 사용하여 두 개의 노드를 비교하면 해당 노드가 동일한 노드인지 여부를 확인할 수 있습니다. 노드 비교 연산자에는 노드 형식의 피연산자 두 개가 허용됩니다.


    예제: 두 개의 주소 노드를 비교하여 ID 검사


    다음 쿼리는 두 개의 address 노드를 비교하여 문서의 동일한 노드를 나타내는지 여부를 검사합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    if ( (/RES:Resume/RES:Address)[1] is (//RES:Address)[1] )
    then
    Nodes are equal
    else
    Nodes are not equal
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3



    노드 순서 비교 연산자


    노드 순서 비교 연산자를 사용하여 문서에 있는 두 노드의 순서를 확인할 수 있습니다. SQL Sever 2005에서 지원되는 노드 순서 비교 연산자는 >> 및 << 이며 두 연산자는 모두 두 개의 피연산자를 허용합니다. 문서 순서에서 왼쪽 피연산자가 오른쪽 피연산자보다 앞에 올 경우 >> 연산자는 true를 반환하고 문서 순서에서 왼쪽 피연산자가 오른쪽 피연산자 뒤에 올 경우<< 연산자는 true를 반환합니다.


    예제: 두 주소 노드의 순서 비교


    다음 쿼리는 JobCandidateID가 3인 후보에 대해 두 address 노드의 순서를 비교합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    if ( (/RES:Resume/RES:Address/RES:Addr.Type[.="Home"])[1] << (/RES:Resume/RES:Address/RES:Addr.Type[.="Permanent"])[1] )
    then
    Home address precedes Permanent address
    else
    Home address follows Permanent address
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3



    논리 연산자


    SQL Server 2005의 XQuery에서 지원되는 논리 연산자는 and 및 or입니다. 이러한 연산자를 사용하여 작성한 논리 식의 값은 true 또는 false가 될 수 있습니다.


    예제: and 연산자를 사용하여 논리 식 만들기


    다음 쿼리는 bachelor level business degree를 포함하는 후보의 education 요소를 반환합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    /RES:Resume/RES:Education[RES:Edu.Level="Bachelor" and RES:Edu.Major="Business"]
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3



    if-then-else 구문

    다른 기능적 언어와 마찬가지로 XQuery는 if-then-else 구문을 지원합니다. if-then-else 문을 사용하여 조건식 값에 기초한 작업을 수행할 수 있습니다.


    예제: 조건식 사용

    다음 쿼리는 JobCandidateID가 3인 후보의 이력서에 지정된 주소 유형을 표시합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $A in /RES:Resume/RES:Address
    return
    if ( $A/RES:Addr.Type eq "Home" )
    then
    Home Address
    else
    Other Address
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3



    XQuery를 사용하여 XML 생성


    XQuery 생성자를 사용하면 쿼리 내에서 XML 구조를 만들 수 있습니다. 요소, 특성, 처리 명령, 텍스트 노드 및 주석에 생성자를 사용할 수 있습니다.


    다음 예제는 XML을 생성하는 이러한 접근 방법을 보여 줍니다.


    예제: 상수 식 사용

    다음 쿼리는 상수 식을 사용하여 생성된 고용 기록 세부 정보를 표시합니다.


    SELECT Resume.query(''

    ABC Technologies
    Software Engineer
    2001-10-01
    2003-05-09

    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3


    예제: 동적으로 얻은 데이터 사용

    다음 쿼리는 JobCandidateID가 3인 후보에 대한 쿼리에서 얻은 결과를 사용하여 생성된 고용 기록 세부 정보를 표시합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $EMP in /RES:Resume/RES:Employment
    return

    { $EMP/RES:Emp.StartDate }
    { $EMP/RES:Emp.EndDate }
    { $EMP/RES:Emp.JobTitle }

    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3


    예제: 계산된 요소 및 특성 생성자에 상수 이름 사용

    다음 쿼리는 JobCandidateID가 3인 후보의 고용 기록을 표시합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $EMP in /RES:Resume/RES:Employment
    return
    element Employer
    {
    attribute Organization { $EMP/RES:Emp.OrgName },
    element StartDate { string($EMP/RES:Emp.StartDate) },
    element EndDate { string($EMP/RES:Emp.EndDate) },
    element JobTitle { string($EMP/RES:Emp.JobTitle) }
    }
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3



    XQuery 생성 수행 및 FOR XML을 사용한 형태 정의 비교


    일부 응용 프로그램에서는 행 집합에서 XML을 생성하는 것이 요구됩니다. 서버에서는 FOR XML 절이나 XQuery 생성 또는 XML DML 작업을 사용하여 XML을 생성할 수 있습니다. FOR XML 및 XQuery 생성자를 사용하여 XML을 생성할 경우의 권장 사항은 다음과 같습니다.


    여러 열과 여러 행에서 XML을 집계하려는 경우 FOR XML만 사용할 수 있습니다.
    단일 XML 인스턴스의 형태를 변경하려는 경우 FOR XML뿐만 아니라 XQuery를 사용할 수 있습니다. FOR XML의 경우 XML 인스턴스에서 XML 데이터 형식 메서드를 여러 번 호출해야 하므로 XQuery가 더 빠를 수 있습니다.
    여러 XML DML 문을 사용하여 XML 인스턴스를 생성할 수 있습니다. 이 방법은 XQuery 생성보다 훨씬 느립니다.
    FOR XML 쿼리의 결과를 XML 데이터 형식의 인스턴스로 생성하려면 SQL Server 2005의 FOR XML 절에서 사용할 수 있는 새 TYPE 지시문을 사용합니다.



    기본 제공 XQuery 함수


    SQL Server 2005의 XQuery 구현에서는 XQuery 1.0 및 XPath 2.0 기본 제공 함수의 하위 집합이 지원됩니다. 이러한 함수에는 데이터 접근자 함수, 문자열 조작 함수, 집계 함수, 컨텍스트 함수, 숫자 함수, 부울 함수, 노드 함수, 시퀀스 함수 등이 있습니다. 다음 절에서는 이러한 함수 중 몇 가지에 대해 설명합니다.



    데이터 접근자


    데이터 접근자 함수를 사용하여 노드의 값을 문자열 또는 형식 있는 값으로 추출할 수 있습니다. XQuery는 두 가지 유형의 데이터 접근자 함수를 지원합니다. 그 중 하나인 string()은 항목의 문자열 값을 추출하며 다른 하나인 data()는 형식 있는 값을 가져옵니다. 노드가 텍스트 노드, 특성 노드 또는 요소 노드가 아닌 경우 data() 함수는 정적 오류를 발생시킵니다. 노드가 형식 없는 XML 인스턴스의 문서 노드인 경우 data()는 문서의 문자열 값을 반환합니다. 노드가 복합 형식 요소인 경우 data() 함수는 정적 오류를 반환합니다.


    예제: string() 함수 사용


    string() 함수 및 계산된 요소 생성자를 사용하여 후보의 고용 기록을 생성하는 쿼리는 이 문서의 "XQuery를 사용하여 XML 생성" 절에서 예제: 계산된 요소 및 특성 생성자에 상수 이름 사용 예제를 참조하십시오.


    예제: data() 함수 사용


    다음 쿼리는 data() 함수 및 계산된 요소 생성자를 사용하여 후보의 고용 기록을 생성합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $ED in /RES:Resume/RES:Education
    where xs:decimal( data($ED/RES:Edu.GPA) ) gt 3.5
    return
    element Education
    {
    element Level { data($ED/RES:Edu.Level) },
    element Degree { data($ED/RES:Edu.Degree) },
    element GPA { data($ED/RES:Edu.GPA) },
    element GPAScale { data($ED/RES:Edu.GPAScale) }
    }
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2



    문자열 조작


    XQuery는 다음 네 개의 문자열 조작 함수를 지원합니다.


    concat()를 사용하여 두 개 이상의 문자열을 연결할 수 있습니다.
    contains()를 사용하면 첫 번째 피연산자로 지정된 문자열이 두 번째 피연산자로 지정된 다른 문자열을 포함하는지 여부를 결정할 수 있습니다. 검색 문자열의 길이는 4,000개의 유니코드 문자로 제한됩니다.
    substring()을 사용하면 소스 문자열로 알려진 다른 문자열에서 문자열의 일부를 추출할 수 있습니다.
    string-length()를 사용하면 문자열 길이를 계산할 수 있습니다.
    현재 릴리스의 SQL Server 2005에서는 유니코드 코드 포인트 데이터 정렬만 지원됩니다.


    예제: concat() 및 substring() 함수 사용/p>

    다음 쿼리는 start date, end date, organization name 및 job title의 값을 연결하여 후보의 고용 기록을 생성합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $EMP in /RES:Resume/RES:Employment
    return

    {
    concat( substring(string($EMP/RES:Emp.StartDate),1,10)," to ",
    substring(string($EMP/RES:Emp.EndDate),1,10), ", ",
    string($EMP/RES:Emp.OrgName), ", ",
    string($EMP/RES:Emp.JobTitle) )
    }

    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3


    예제: contains() 함수 사용


    다음 쿼리는 Edu.Degree 요소의 값에 science 문자열을 포함하는 노드에 대한 Education 세부 정보를 표시하여 contains() 함수가 사용되는 방법을 보여 줍니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $ED in /RES:Resume/RES:Education
    where contains($ED/RES:Edu.Degree, "Science")
    return
    element Education
    {
    element Level { data($ED/RES:Edu.Level) },
    element Degree { data($ED/RES:Edu.Degree) },
    element GPA { data($ED/RES:Edu.GPA) },
    element GPAScale { data($ED/RES:Edu.GPAScale) }
    }
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2



    집계 함수


    집계 함수는 항목 시퀀스에서 작동하여 시퀀스의 집계 값을 반환합니다. 현재 SQL Server 2005의 XQuery에서 지원되는 집계 함수는 count(), min(), max(), avg() 및 sum()입니다. min() 및 max() 함수에는 gt 연산자를 지원하는 기본 형식만 허용됩니다(예: 세 가지 기본 제공 숫자 기본 형식, 날짜/시간 기본 형식, xs:string, xs:boolean 및 xdt:untypedAtomic). 혼합된 형식의 시퀀스는 이러한 함수에서 지원되지 않습니다. 또한 xdt:untypedAtomic은 xs:double로 간주됩니다.


    avg() 및 sum()의 경우 전달된 식의 형식은 기본 제공되는 세 가지 숫자 기본 형식 중 하나 또는 untypedAtomic의 하위 형식이어야 합니다(혼합 형식은 허용되지 않으며 xdt:untypedAtomic은 xs:double로 간주됨).


    count() 함수는 시퀀스의 항목 수를 반환합니다.


    예제: count() 함수 사용


    다음 쿼리는 count() 함수를 사용하여 문서에 존재하는 employment, education 및 address 요소의 수를 표시합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    Element count is { count(/RES:Resume/RES:Address) },
    Element count is { count(/RES:Resume/RES:Education) },
    Element count is { count(/RES:Resume/RES:Address) }
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3

    예제: min() 함수 사용


    쿼리는 min() 함수를 사용하여 GPA 값아 최소인 education 요소를 표시합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $ED in /RES:Resume/RES:Education
    where $ED/RES:Edu.GPA = min(/RES:Resume/RES:Education/RES:Edu.GPA)
    return
    $ED
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2


    예제: max() 함수 사용


    다음 쿼리는 max() 함수를 사용하여 GPA 값이 최대인 education 요소를 표시합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $ED in /RES:Resume/RES:Education
    where $ED/RES:Edu.GPA = max(/RES:Resume/RES:Education/RES:Edu.GPA)
    return
    $ED
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2


    예제: avg() 함수 사용


    다음 쿼리는 avg() 함수를 사용하여 일주일 동안의 New York과 Boston의 최고 및 최저 온도 평균을 계산합니다.


    DECLARE @Weather xml
    SET @Weather = ''



















    ''

    SELECT @Weather.query(''


    { avg(/WeatherInfo/NewYork/Temp/@High) }
    { avg(/WeatherInfo/NewYork/Temp/@Low) }


    { avg(/WeatherInfo/Boston/Temp/@High) }
    { avg(/WeatherInfo/Boston/Temp/@Low) }


    '') as Result


    예제: sum() 함수 사용


    다음 쿼리는 sum() 및 count() 함수를 사용하여 일주일 동안의 New York과 Boston의 최고 및 최저 온도 평균을 계산합니다.


    DECLARE @Weather xml
    SET @Weather = ''



















    ''

    SELECT @Weather.query(''


    { sum(/WeatherInfo/NewYork/Temp/@High) div count(/WeatherInfo/NewYork/Temp/@High) }
    { sum(/WeatherInfo/NewYork/Temp/@Low) div count(/WeatherInfo/NewYork/Temp/@Low) }


    { sum(/WeatherInfo/Boston/Temp/@High) div count(/WeatherInfo/Boston/Temp/@High) }
    { sum(/WeatherInfo/Boston/Temp/@Low) div count(/WeatherInfo/Boston/Temp/@Low) }


    '') as Result



    컨텍스트 함수


    컨텍스트 함수를 사용하여 컨텍스트 항목의 컨텍스트 속성을 얻을 수 있습니다. SQL Server 2005는 두 개의 컨텍스트 함수인 last() 및 position()을 구현합니다. last() 함수를 사용하면 시퀀스의 항목 수를 확인할 수 있으며 position() 함수를 사용하면 컨텍스트 항목의 위치를 얻을 수 있습니다. 인수가 없는 last() 및 position() 함수는 SQL Server 2005에서 컨텍스트에 무관한 조건자의 컨텍스트(예: [] 안쪽)에서만 사용할 수 있습니다.


    예제: last() 함수 사용


    다음 쿼리는 last() 함수를 사용하여 후보의 마지막 address 요소를 검색합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    /RES:Resume/RES:Address[last()]
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3


    예제: position() 함수 사용


    다음 쿼리는 position() 함수를 사용하여 후보의 처음 두 개 address 요소를 검색합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    /RES:Resume/RES:Address[position()<=2]
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3



    형식 관련 식


    XQuery는 형식 정보에 기초하는 다양한 유형의 식이나 연산자를 지원합니다. 이러한 식은 형식 어설션 식, 형식 조사 식 및 형식 캐스팅 식으로 분류됩니다. 다음 절에서는 이러한 식에 대해 간략하게 설명합니다.



    형식 어설션 식


    as xs:for 문의TYPE 절

    as 절을 사용하여 for 문에 사용되는 바인딩 변수의 형식을 지정할 수 있습니다.

    바인딩 변수에 대한 형식이 선언된 경우 선언된 형식이 아닌 바인딩 값은 형식 오류를 야기합니다. xs:TYPE 절은 캐스트 식이 아니지만 형식 어설션으로 사용됩니다.


    예제: for 문과 함께 "as xs:TYPE" 절 사용


    다음 쿼리는 형식 요소(RES:Address)로 정의되는 변수 $A에 주소 노드 시퀀스를 바인딩합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $A as element(RES:Address) in /RES:Resume/RES:Address
    return
    $A
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2



    형식 조사 식


    instance of xs:TYPE 연산자

    instance of 연산자를 사용하면 XML 문서에 있는 항목의 런타임 형식을 식별할 수 있습니다.


    예제: "instance of xs:TYPE" 연산자 사용


    다음 쿼리는 XPath 식으로 식별된 주소 노드의 형식이 element() 형식과 일치하는지 여부를 검사합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    if ( (/RES:Resume/RES:Address)[1] instance of element() )
    then
    Selected node is an Element
    else
    Selected node is not an Element
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3



    형식 캐스팅 식


    암시적 형식 캐스팅

    XQuery 엔진은 산술 연산 또는 함수 호출을 포함하는 식의 숫자 형식 및 untypedAtomic 값에 대한 암시적 형식 캐스팅을 수행합니다. 이 프로세스를 형식 승격이라고 합니다. 예상 숫자 형식과 호환되지 않은 숫자 형식이 식 결과로 얻어질 경우 형식 승격이 발생합니다. 결과 식을 필요한 형식으로 캐스팅하는 방법으로 형식 승격이 수행됩니다.


    예제: 암시적 형식 캐스팅


    다음 쿼리는 10진수 값과 double 값에서 산술 연산을 수행합니다. 현재 시나리오에서는 xs:decimal 값을 xs:double로 승격한 후에만 식 값이 추가됩니다.


    DECLARE @Result xml
    SET @Result = ''''
    SELECT @Result.query(''
    { xs:decimal("10.55") + xs:double(1.5e1) }
    '') as Result


    명시적 형식 캐스팅
    형식 있는 값 생성자

    XQuery는 XML 스키마 사양에 정의된 모든 기본 제공 형식에 대한 생성자 함수를 제공합니다. 이러한 생성자는 형식 있는 값을 생성하는 경우와 특정 형식의 값을 다른 형식으로 캐스팅하는 경우에 유용하게 사용됩니다. 또한 XQuery에서는 가져온 스키마에 정의된 형식에 대해 생성자를 사용할 수 있습니다.


    예제: 값 생성자를 사용하여 값 생성


    다음 쿼리는 xs:date 형식에 대한 생성자를 사용하여 생성한 값보다 큰 StartDate를 가지는 모든 Employment 노드를 반환합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $EMP in /RES:Resume/RES:Employment
    where $EMP/RES:Emp.StartDate gt xs:date("1995-01-01")
    return
    $EMP
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 3


    예제: 값 생성자를 사용하여 형식 캐스팅


    다음 쿼리는 JobCandidateID가 2인 후보에 대해 GPA가 3.8보다 크거나 같은 모든 Education 노드를 선택합니다. 이 쿼리는 Edu.GPA 값을 xs:string에서 xs:decimal로 형식 캐스팅하기 위해 xs:decimal에 대한 값 생성자를 사용합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $ED in /RES:Resume/RES:Education
    where xs:decimal( data($ED/RES:Edu.GPA) ) ge 3.8
    return
    element Education
    {
    element Level { string($ED/RES:Edu.Level)},
    element StartDate { string($ED/RES:Edu.StartDate)},
    element EndDate { string($ED/RES:Edu.EndDate)},
    element Degree { string($ED/RES:Edu.Degree)},
    element GPA { string($ED/RES:Edu.GPA)},
    element GPAScale { string($ED/RES:Edu.GPAScale)}
    }
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2


    cast as xs:TYPE ? 연산자


    SQL Server 2005의 XQuery는 명시적 형식 캐스팅을 수행하는 데 유용한 cast as TYPE ? 연산자를 지원합니다. 또한 cast as TYPE ? 연산자보다 편리하게 작성할 수 있는 xs:TYPE() 생성자를 사용하여 명시적 형식 캐스팅을 수행할 수도 있습니다.


    예제: "cast as xs:TYPE ?" 연산자 사용


    다음 쿼리는 JobCandidateID가 3인 후보에 대해 Education 노드 집합에서 선택한 요소의 형식 있는 값을 포함하는 XML을 생성합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $ED in /RES:Resume/RES:Education
    return
    element Education
    {
    element Level { $ED/RES:Edu.Level cast as xs:string? },
    element StartDate { $ED/RES:Edu.StartDate cast as xs:date? },
    element EndDate { $ED/RES:Edu.EndDate cast as xs:date? },
    element Degree { $ED/RES:Edu.Degree cast as xs:string? },
    element GPA { $ED/RES:Edu.GPA cast as xs:decimal? },
    element GPAScale { $ED/RES:Edu.GPAScale cast as xs:decimal? }
    }
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2


    예제: "xs:TYPE()" 연산자 사용


    다음 쿼리는 cast as xs:TYPE ? 연산자 대신에 xs:TYPE() 연산자를 사용하여 앞의 예제 쿼리와 동일한 결과를 생성합니다.


    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $ED in /RES:Resume/RES:Education
    return
    element Education
    {
    element Level { xs:string($ED/RES:Edu.Level) },
    element StartDate { xs:date($ED/RES:Edu.StartDate) },
    element EndDate { xs:date($ED/RES:Edu.EndDate) },
    element Degree { xs:string($ED/RES:Edu.Degree) },
    element GPA { xs:decimal($ED/RES:Edu.GPA) },
    element GPAScale { xs:decimal($ED/RES:Edu.GPAScale) }
    }
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = 2



    관계형 열과 변수 액세스


    XQuery를 사용하여 쿼리를 작성할 경우 쿼리에서 관계형 열과 변수에 액세스하는 것이 일반적으로 요구됩니다. SQL Server 2005는 두 개의 함수인 sql:column() 및 sql:variable()을 구현하여 이 요구 사항을 충족합니다.


    sql:column() 함수를 사용하면 쿼리에서 관계형 테이블에 있는 비 XML 열에 액세스할 수 있습니다. 이 함수는 하나 이상의 테이블에 있는 XML 및 비 XML 열에서 정보를 집계하거나 비 XML 열의 값을 사용하여 XQuery 결과를 필터링하는 등의 상황에 유용합니다. sql:column() 및 sql:variable() 함수는 datetime, CLR 사용자 정의 함수 또는 XML과 함께 사용할 수 없습니다.


    예제: sql:column() 함수 사용


    다음 쿼리는 비 XML 데이터 형식의 CustomerID 및 Name 열에 있는 값과 Demographics 열에 있는 YearOpened, NumberOfEmployees, AnnualSales 및 AnnualRevenue 요소의 값을 포함하는 XML을 생성합니다.


    SELECT Demographics.query(''
    declare namespace ST="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/StoreSurvey";
    element CustomerInfo
    {
    element CustomerID { sql:column("Store.CustomerID") },
    element Name { sql:column("Store.Name") },
    element YearOpened { string((/ST:StoreSurvey/ST:YearOpened)[1]) },
    element NumberOfEmployees { string((/ST:StoreSurvey/ST:NumberEmployees)[1]) },
    element AnnualSales { string((/ST:StoreSurvey/ST:AnnualSales)[1]) },
    element AnnualRevenue { string((/ST:StoreSurvey/ST:AnnualRevenue)[1]) }
    }
    '') as Result
    FROM [Sales].[Store] Store
    WHERE Store.CustomerID = 4


    예제: sql:variable() 함수 사용


    다음 저장 프로시저는 XQuery where 절의 @AddrType 변수 값을 사용하여 쿼리 결과를 필터링함으로써 지정된 후보의 home address 노드를 반환합니다.


    CREATE PROCEDURE [GetCandidateAddress]
    @JobCandidateID [int],
    @AddrType [varchar](20)
    AS
    BEGIN
    SET NOCOUNT ON;

    SELECT Resume.query(''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    for $A in /RES:Resume/RES:Address
    where $A[ RES:Addr.Type = sql:variable("@AddrType") ]
    return
    $A
    '') as Result
    FROM [HumanResources].[JobCandidate]
    WHERE JobCandidateID = @JobCandidateID

    END


    예제: XML 데이터 형식의 exist() 메서드와 함께 sql:variable() 함수 사용


    다음 쿼리는 경영학 학사 학위를 가진 후보의 이력서를 반환합니다.


    DECLARE @EducationLevel varchar(20)
    SET @EducationLevel = ''Bachelor''

    DECLARE @Major varchar(20)
    SET @Major = ''Business''

    SELECT JobCandidateID, Resume
    FROM [HumanResources].[JobCandidate]
    WHERE Resume.exist (''
    declare namespace RES="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume";
    /RES:Resume/RES:Education[ RES:Edu.Level = sql:variable("@EducationLevel") and RES:Edu.Major = sql:variable("@Major") ]'') = 1



    지원되지 않는 기능과 해결 방법


    현재 SQL Server 2005에서 구현된 XQuery는 다음 기능을 지원하지 않습니다.


    * let 절: FLWOR 식의 일부인 let 절은 변수를 식 결과에 바인딩하는 데 유용합니다. 해결 방법 - let 절을 사용하는 대신에 인라인 식을 사용합니다.


    * 범위 식(to 연산자): 범위 식을 사용하면 to 연산자를 사용하여 연속된 정수 시퀀스를 생성할 수 있습니다. 예를 들어, (6 to 10)와 같은 범위 식을 사용하면 (6, 7, 8, 9, 10) 시퀀스를 생성할 수 있습니다. 해결 방법 - to 연산자를 사용하는 대신에 시퀀스의 모든 항목을 나열합니다.


    * 형식 정보: typeswitch, treat as, castable 및 validate 식과 같은 형식 시스템에 기반을 두는 일부 기능은 현재 지원되지 않습니다.

    • typeswitch 식 기능은 다른 프로그래밍 언어에서 사용할 수 있는 switch-case 구문과 비슷합니다. switch-case 문에서 branch/case는 스위치에 전달된 인수 값에 따라 선택됩니다. typeswitch 식에서 branch는 typeswitch에 전달된 인수 유형에 따라 선택됩니다. 해결 방법 ? if then else 및 instance of를 사용합니다.

    • treat as 식을 사용하면 식 결과의 정적 형식을 특정 정적 형식으로 변경할 수 있으며 식의 정적 형식이 지정된 형식과 일치하지 않을 경우 정적 형식 오류가 발생합니다. 식의 동적 형식이나 값은 변경되지 않습니다. 해결 방법 ? 없음

    • castable 식은 원자 값을 지정된 형식으로 캐스팅할 수 있는지 여부를 검사하는 데 유용합니다. 해결 방법 - "$x castable as T?" 식을 사용하는 대신에 "empty(data($x)) or not(empty(T($x)))" 식을 사용합니다.

    • validate 식은 현재 범위에 존재하는 스키마 정의에 기초하여 인수에 대한 유효성 검사를 수행합니다. 해결 방법 - validate 식을 사용하는 대신에 요청된 스키마 컬렉션에 대한 Transact-SQL 캐스팅을 사용합니다.

    * 재사용성: 다른 프로그래밍 언어에서와 마찬가지로 유용하고 복잡한 쿼리를 포함하는 사용자 정의 함수로 알려진 재사용 가능한 함수를 작성할 수 있습니다. 또한 사용자 정의 함수 컬렉션을 모듈로 패키지화할 수 있습니다. 쿼리는 모듈을 가져와 모듈에서 제공되는 함수를 사용할 수 있습니다. 쿼리의 프롤로그 섹션에 포함하여 모듈을 쿼리로 가져올 수 있습니다. 현재 SQL Server 2005에서는 해결 방법이 없습니다.


    * 기본 제공 함수: 현재 SQL Server 2005에서는 다음 기본 제공 함수가 지원되지 않습니다. 이러한 함수에 대한 자세한 내용은 W3C.org 웹 사이트에서 XQuery 1.0 및 XPath 2.0 함수 및 연산자 (영문)를 참조하십시오.

    • 접근자: fn:node-name(), fn:nilled(), fn:base-uri(), fn:document-uri().

    • 오류 함수: fn:error().

    • 추적 함수: fn:trace().

    • 숫자 값에 대한 함수: abs(), round-half-to-even().

    • 문자열 처리 함수: codepoints-to-string(), string-to-codepoints(), compare(), string-join(), normalize-space(), normalize-unicode(), upper-case(), lower-case(), translate(), escape-uri(), starts-with(), ends-with(), substring-before(), substring-after(), matches(), replace(), tokenize().

    • anyURI에 대한 함수 및 연산자: resolve-uri().

    • 기간, 날짜 및 시간에 대한 함수 및 연산자: years-from-duration(), months-from-duration(), days-from-duration(), hours-from-duration(), minutes-from-duration(), seconds-from-duration(), year-from-dateTime(), month-from-dateTime(), month-from-dateTime(), day-from-dateTime(), hours-from-dateTime(), minutes-from-dateTime(), seconds-from-dateTime(), timezone-from-dateTime(), year-from-date(), month-from-date(), day-from-date(), timezone-from-date(), hours-from-time(), minutes-from-time(), seconds-from-time(), timezone-from-time(), adjust-dateTime-to-timezone(), adjust-date-to-timezone(), adjust-time-to-timezone(), subtract-dateTimes-yielding-yearMonthDuration(), subtract-dateTimes-yielding-dayTimeDuration(), subtract-dates-yielding-yearMonthDuration(), subtract-dates-yielding-dayTimeDuration(). 또한 xdt:dayTimeDuration 및 xdt:yearMonthDuration 형식도 지원되지 않습니다.


    • Qnames와 관련된 함수: resolve-QName(), QName(), namespace-uri-for-prefix(), in-scope-prefixes().
    • 노드에 대한 함수: name(), lang(), root(). 해결 방법 - root() 대신 /을 사용합니다.
    • 시퀀스에 대한 함수 및 연산자: fn:boolean(), fn:index-of(), fn:exists(), insert-before(), remove(), reverse(), subsequence(), unordered(), zero-or-one(), one-or-more(), exactly-one(), deep-equal(), 두 개의 인수를 가지는 id(), idref(), doc(), collection() 함수 및 union, intersect 및 except 연산자. 해결 방법 ? fn:boolean() 대신 not(not())을, fn:exists() 대신 not(empty())을, zero-or-one() 또는 exactly-one() 대신 명시적 for iteration 또는 [1]을 사용합니다.
    • 컨텍스트 함수: current-dateTime(), current-date(), current-time(), default-collation(), implicit-timezone().


    *위치 변수: at 절을 사용하여 FLWOR 문의 일부로 위치 변수를 정의할 수 있습니다. 위치 변수는 식 결과에서 항목 위치를 식별하는 데 유용합니다.


    *순서 한정자: order by 절을 사용하여 지정된 순서 한정자 "empty greatest | least"는 지원되지 않습니다. ? 기타 기능: 다음 기능은 지원되지 않습니다.


    *기타 기능: The following features are not supported:

    • idiv 연산자.

    • 명시적 스키마 가져오기는 지원되지 않습니다.

    • 외부 변수는 지원되지 않습니다.

    • 경계 공백 유지 옵션은 지원되지 않습니다.

    • 노드 및 값과 같은 유형이 다른 시퀀스를 연결하는 기능은 지원되지 않습니다.

    • 표준 시간대 유지는 지원되지 않습니다.

    • 단순 형식 콘텐츠를 가진 요소의 텍스트 노드에 액세스하는 기능은 지원되지 않습니다.

    • 형식 있는 XML 데이터 형식 인스턴스의 xsi:* 특성에 액세스하는 기능은 지원되지 않습니다.


    최상의 실행 방법 및 지침


  • 형식 정보가 있는 경우 활용합니다. 형식 정보를 활용하면 성능이 향상되며 정적 형식 검사를 수행하여 오류를 발견할 수 있습니다.

  • XML 데이터 형식에서 일부 속성 값을 추출하여 관계형 쿼리에서 사용하려면 속성 승격을 위해 XQuery를 사용합니다. 성능 향상을 위해 자주 사용되는 속성이 관계형 열로 승격되고 인덱싱됩니다.

  • 카디널리티 불일치로 인한 정적 오류를 방지하기 위해 서수(예: [1]) 또는 명시적 FLWOR을 사용합니다.

  • 정적 형식 오류를 방지하기 위해 명시적 캐스트를 사용합니다.

  • 인덱스 사용: Xpath 식을 많이 사용하는 쿼리가 있을 경우 PATH 인덱스를 만듭니다. 부정확하게 알려진 경로(예: /a/* 또는 //b)를 가진 요소 또는 특성 값을 검색하는 작업이 포함된 Xpath 식이 XQuey 쿼리에 있는 경우 VALUE 인덱스를 사용합니다. XML 인스턴스에서 알려진 속성의 모든 경우를 쿼리에서 검색하는 경우에 PROPERTY 인덱스가 유용합니다.

  • 참조된 대부분의 형식이 단일 네임스페이스의 일부이면 기본 네임스페이스를 사용하여 그렇지 않으면 접두사를 사용합니다.


    최상의 실행 방법에 대한 자세한 내용은 MSDN 기사 Microsoft SQL Server 2005를 위한 XML 최상의 실행 방법 및 XML 데이터 형식을 위한 성능 최적화를 참조하십시오.



    XML 데이터 수정


    SQL Server 2005는 데이터베이스에 저장된 XML 인스턴스를 수정하는 것을 지원합니다. 최신 버전의 W3C XQuery 초안에는 XML 문서를 수정하기 위한 구문이 정의되어 있지 않습니다. XML 문서를 수정하기 위한 메커니즘을 제공하고 위해 Microsoft는 XML DML(Data Modification Language)을 개발했습니다. XML 데이터 형식의 modify 메서드를 사용하고 XML DML 문으로 수정을 지정하여 XML 문서를 수정할 수 있습니다.


    XML DML은 insert, delete 및 replace value of 키워드를 사용하여 XML 문서에서 삽입, 삭제 및 업데이트 작업을 지원합니다. 형식 있는 XML 인스턴스의 수정은 XML 데이터 형식에 정의된 스키마 제약 조건에 기반을 두는 유효성 검사를 따릅니다.


    다음 테이블과 XML 인스턴스는 XML DML 작업을 보여 줍니다.


    테이블:


    CREATE TABLE [CandidateInfoXMLDataType]
    (
    [JobCandidateID] [int] IDENTITY(1,1) NOT NULL,
    [Resume] [xml] NOT NULL,
    [ModifiedDate] [datetime] NOT NULL DEFAULT (getdate())
    )


    샘플 XML 인스턴스:




    Mike

    Chen


    34 181st Place SE
    Apt 3344
    Redmond
    WA
    US
    9870909023


    BS
    MS


    ASP.NET
    SQL



    ABC Technologies
    NY, US
    20/02/2000
    10/04/2004
    Project Leader
    Responsible for design,development,testing activities




    삽입 작업


    insert 키워드를 사용하여 하나 이상의 노드를 XML 문서에 삽입할 수 있습니다. insert 키워드에는 삽입할 노드를 식별하는 XQuery 식과 참조 노드를 지정하는 다른 XQuery 식이 허용됩니다.

    또한 참조 노드와 관련하여 새 노드를 위치를 지정하기 위해 into, after 및 before와 같은 키워드를 포함할 수 있습니다. into 키워드를 지정할 경우 새 노드가 참조 노드의 자식으로 삽입됩니다. into 키워드를 포함할 경우 참조 노드의 기존 자식 노드와 관련하여 삽입된 노드의 위치를 나타내는 as first 또는 as last 키워드도 지정해야 합니다. 또한 after 또는 before 키워드를 지정하여 참조 노드 뒤쪽이나 앞쪽에 새 노드를 형제 노드로 삽입할 수 있습니다.

    대상 식(Expression2)이 단일 노드를 정적으로 식별하지 않은 경우 삽입 작업이 실패하고 정적 오류가 발생합니다.


    구문:


    insert
    Expression1 (
    {{{as first | as last} into} | after | before}
    Expression2 )


    예제: 기술 삽입


    다음 저장 프로시저를 사용하면 지정된 후보에 대한 새 기술을 삽입할 수 있습니다. 이 저장 프로시저는 sql:variable() 함수를 사용하여 XML DML 문 안에 있는 Transact-SQL 변수에 액세스합니다. XML 안에서 비 XML 관계형 데이터를 바인딩하는 방법에 대한 자세한 내용은 관계형 열과 변수 액세스를 참조하십시오.


    다음 저장 프로시저는 사용자가 특정 기술의 문자열 값을 두 번째 인수로 저장 프로시저에 전달한다는 가정 하에 작성되었습니다. 하나 이상의 기술 요소를 포함하는 XML 단편을 허용하도록 이 저장 프로시저를 수정할 수 있습니다. 이렇게 하면 사용자는 한 번의 호출로 여러 기술 노드를 저장 프로시저에 삽입할 수 있습니다.


    /* Stored procedure to insert a new skill element for a candidate */
    CREATE PROCEDURE [InsertSkillInfo]
    @JobCandidateID [int],
    @Skill [varchar](200)
    AS
    BEGIN
    SET NOCOUNT ON;

    UPDATE [CandidateInfoXMLDataType]
    SET Resume.modify(''
    insert element Skill {sql:variable("@Skill")}
    as last
    into (/JobCandidate/Skills)[1]
    '')
    WHERE JobCandidateID = @JobCandidateID
    END



    삭제 작업


    delete 키워드를 사용하면 XML 인스턴스에서 하나 이상의 노드를 삭제할 수 있습니다. delete 키워드에서는 XML 문서에 삭제할 하나 이상의 노드를 식별하는 XQuery 식이 허용됩니다.


    구문:

    delete Expression


    예제: 기술 삭제

    다음 예제는 delete 키워드를 사용하여 지정된 후보의 기술을 삭제하는 방법을 보여 줍니다.


    다음 저장 프로시저는 사용자가 특정 기술의 문자열 값을 두 번째 인수로 저장 프로시저에 전달한다는 가정 하에 작성되었습니다. 하나 이상의 기술 요소를 포함하는 XML 단편을 허용하도록 이 저장 프로시저를 수정할 수 있습니다. 이렇게 하면 사용자는 저장 프로시저를 한 번 호출하여 여러 기술 노드를 삭제할 수 있습니다.


    /* Stored procedure to delete a specified skill element for a candidate */
    CREATE PROCEDURE [DeleteSkillInfo]
    @JobCandidateID [int],
    @Skill [varchar](200)
    AS
    BEGIN
    SET NOCOUNT ON;

    UPDATE [CandidateInfoXMLDataType]
    SET Resume.modify(''
    delete (/JobCandidate/Skills/Skill[.=sql:variable("@Skill")])
    '')
    WHERE JobCandidateID = @JobCandidateID
    END


    하나 이상의 기술 요소를 포함하는 XML 단편을 허용하도록 이 저장 프로시저를 쉽게 수정할 수 있습니다. 이 경우 사용자는 저장 프로시저를 한 번 호출하여 여러 기술 노드를 삭제할 수 있습니다.


    업데이트 작업


    replace value of 키워드를 사용하면 기존 노드의 값을 수정할 수 있습니다. 기존 노드의 값을 수정하려면 값을 업데이트할 노드를 식별하는 하나의 XQuery 식과 노드의 새 값을 지정하는 또 다른 식을 지정해야 합니다.


    형식 없는 XML 인스턴스를 수정하는 동안 대상 식은 단순 형식 노드를 반환해야 합니다. 형식 있는 XML 인스턴스의 대상 식은 소스 식과 동일한 형식 또는 하위 형식으로 평가되어야 합니다.


    구문:

    replace value of
    Expression1
    with
    Expression2


    예제: 기술 업데이트

    다음 예제는 replace value of 키워드를 사용하여 지정된 후보의 기존 기술 값을 업데이트하는 방법을 보여 줍니다.


    /* Stored procedure to update a specified skill element for a candidate */
    CREATE PROCEDURE [UpdateSkillInfo]
    @JobCandidateID [int],
    @SkillOld [varchar](200),
    @SkillNew [varchar](200)
    AS
    BEGIN
    SET NOCOUNT ON;

    UPDATE [CandidateInfoXMLDataType]
    SET Resume.modify(''
    replace value of (/JobCandidate/Skills/Skill[.=sql:variable("@SkillOld")]/text())[1]
    with sql:variable("@SkillNew")
    '')
    WHERE JobCandidateID = @JobCandidateID
    END


    delete 작업과 달리 update 및 insert 작업은 한 번의 작업으로 하나의 노드에만 영향을 줄 수 있습니다.



    XQuery 사용 시나리오


    시나리오 1: 성과 평가 시스템

    회사의 인사부에는 일반적인 평가 관련 활동을 처리하는 성과 평가 시스템이 필요합니다. 일반적으로 평가 레코드에는 평가 기간의 주요 목표와 비교하여 측정된 직원 성과, 다음 평가 기간에 사용할 주요 목표 정의, 직원 교육 요구 식별 등과 같이 주로 설명적인 특성을 가지는 정보가 포함됩니다. XML은 이러한 정보를 처리하는 데 가장 적합합니다. 직원에 대한 평가 정보가 XML 형식 열에 저장될 수 있으며 시스템 사용자는 XQuery를 사용하여 직원의 성과 기록을 쿼리 및 분석할 수 있습니다. 또한 XML DML을 사용하여 평가 레코드를 수정할 수 있습니다.


    회사의 교육 부서가 ASP.NET에 대한 교육 세션을 수행하고 있으며 이러한 교육을 요청했던 모든 직원을 초대하려고 한다고 가정해 보십시오. 다음 쿼리는 평가 프로세스 도중에 ASP.NET에 대한 교육 세션을 선택했던 모든 직원을 선택합니다.


    SELECT Appraisal.query(''
    for $PA in /PerformanceAppraisal,
    $Skill in $PA/TrainingNeeds/Technical/Skill
    where contains($Skill, "ASP.NET")
    return
    element Employee
    {
    element EmpID { data($PA/Employee/EmployeeID) },
    element EmpName { data($PA/Employee/EmployeeName) },
    element EMail { data($PA/Employee/EMailID) },
    element Skill { data($Skill) }
    }
    '') as Result
    FROM [EmployeePerformanceAppraisal]
    WHERE Appraisal.exist(''/PerformanceAppraisal/TrainingNeeds/Technical/Skill/text()[contains(.,"ASP.NET")]'') = 1



    시나리오 2: 의료 레코드 시스템


    병원에서는 환자와 관련된 의료 정보를 캡처할 수 있는 시스템이 필요합니다. 이 정보에는 환자 세부 정보, 보험 정보, 입원 세부 정보, 진단 정보, 치료 정보 등이 포함됩니다. 이 정보는 연구 또는 참조 목적에 사용될 것입니다. 증상, 실험실 보고서 및 치료 정보와 같은 환자 의료 데이터에는 설명 정보가 포함되어 있으므로 이 정보를 저장하기 위한 형식으로 XML이 선택됩니다. 환자 데이터는 XML 형식 열에 저장될 수 있습니다. 병원에서는 이 정보를 분석하기 위해 XQuery를 사용할 수 있습니다.


    다음 테이블과 XML 인스턴스는 환자 의료 레코드 시나리오에서 사용되는 XQuery를 보여 줍니다.


    테이블:

    CREATE TABLE [MedicalRecords](
    [PatientID] [int] IDENTITY(1,1) NOT NULL,
    [PatientRecord] [xml] NOT NULL,
    [ModifiedDate] [datetime] NOT NULL DEFAULT (getdate())
    ,
    PRIMARY KEY CLUSTERED
    (
    [PatientID] ASC
    ) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE PRIMARY XML INDEX idx_PatientRecord on [MedicalRecords] (PatientRecord)
    GO
    CREATE XML INDEX idx_PatientRecord_Path on [MedicalRecords] (PatientRecord) USING XML INDEX idx_PatientRecord FOR PATH


    샘플 XML 인스턴스:



    Robert
    Male
    5

    Blue Cross Blue Shield
    D8456798



    KK Hospital
    Pediatrics


    D4321
    2004-05-02
    2004-05-08



    Abdominal pain
    Dehydration

    Diarrhea

    Oral Rehydration Therapy

    Pepto-Bismol
    Electrolyte Solutions




    “고열”과 “복통” 증상으로 입원했던 환자에 대한 의료 레코드를 의사가 보고 싶어한다고 가정해 보십시오. 다음 쿼리는 “고열”과 “복통” 증상으로 입원했던 환자의 레코드를 검색합니다.


    SELECT PatientID, PatientRecord.query(''
    element PatientName { data(/PatientRecord/PatientDetails/Name) },
    element MedicalInfo { /PatientRecord/ProblemDetails }
    '') as Result
    FROM [MedicalRecords]
    WHERE PatientRecord.exist
    (''/PatientRecord/ProblemDetails/Symptoms/Symptom/text()[contains(.,"Fever")]'') = 1
    AND PatientRecord.exist
    (''/PatientRecord/ProblemDetails/Symptoms/Symptom/text()[contains(.,"Abdominal Pain")]'') = 1



    시나리오 3: 자산 관리 시스템


    회사의 IT 부서는 하드웨어 및 소프트웨어와 같은 자산을 관리할 수 있는 응용 프로그램을 개발해야 합니다. 이 응용 프로그램은 자산 ID, 사용자 세부 정보, 시스템 정보(예: 프로세서, 메모리, BIOS, 마더보드 및 비디오 카드 세부 정보), 시스템에 설치된 소프트웨어, 구매 정보, 보증 정보 등을 비롯하여 하드웨어 자산과 관련된 정보를 추적할 수 있어야 합니다.


    또한 이 응용 프로그램은 소프트웨어 유형, 구매한 라이센스 수 등과 같은 조직의 소프트웨어 자산과 관련된 정보를 유지 관리해야 하며 미래에 정의될 새 자산 유형을 처리하도록 확장할 수 있어야 합니다. 이 자산 관리 시스템은 하드웨어 사용 정보, 소프트웨어 라이센스 사용 정보, 유지 관리해야 할 하드웨어 항목 등과 같은 보고서를 생성하는 데 사용됩니다. 현재의 시나리오에서는 동일한 테이블 열의 다른 스키마를 따르는 정보를 저장하는 것이 필요합니다. 형식 없는 XML을 사용하여 다양한 스키마를 가진 정보를 저장할 수 있습니다. 또한 스키마 컬렉션이 있는 형식 있는 XML을 사용하여 이러한 정보를 저장할 수 있습니다. XML 데이터 형식으로 저장된 자산 정보는 XQuery를 사용하여 쿼리할 수 있습니다.


    IT 부서에서 Microsoft Windows XP와 Microsoft Office 2000이 모두 설치된 컴퓨터 시스템 목록을 선택하고 싶어한다고 가정해 보십시오. 다음 쿼리는 Windows XP와 Office 2000이 모두 설치된 하드웨어 자산의 레코드를 선택합니다.


    SELECT AssetID, AssetDetails.query(''

    {
    element UserName { data(/AssetInfo/UserInfo/Name) },
    element ComputerName { data(/AssetInfo/SystemInfo/ComputerName) },
    element OS { data(/AssetInfo/SystemInfo/OS) }
    }

    '') as Result
    FROM [Assets]
    WHERE Category = ''Hardware''
    AND AssetDetails.exist(''/AssetInfo/SystemInfo/OS/text()[contains(.,"Windows XP")]'') = 1
    AND AssetDetails.exist(''/AssetInfo/SoftwaresInstalled/Software/text()[contains(.,"Office 2000")]'') = 1



    결론


    SQL Server 2005와 관련하여 XQuery의 기본적인 내용을 배우고 싶은 사람들은 이 문서를 기초서로 사용할 수 있을 것입니다. 이 문서에서는 SQL Server 2005에서 구현된 XQuery 언어의 여러 기능과 지원되지 않는 기능에 대해 설명하고 XQuery 언어의 여러 기능을 사용하는 예제를 제공했습니다. 이 문서에 포함된 XQuery 사용 시나리오는 XQuery를 사용하기에 적합한 상황을 식별하는 데 도움이 될 것입니다.




    제공 : DB포탈사이트 DBguide.net

    출처명: 한국 마이크로소프트

  • + Recent posts