XQuery의 형식 캐스팅 규칙
적용 대상:SQL Server
다음 W3C XQuery 1.0 및 XPath 2.0 함수 및 연산자 사양 다이어그램은 기본 제공 데이터 형식을 보여 줍니다. 기본 제공 데이터 형식을 보여 줍니다.
이 항목에서는 다음 메서드 중 하나를 사용하여 한 형식에서 다른 형식으로 캐스팅할 때 적용되는 형식 캐스팅 규칙에 대해 설명합니다.
캐스트 또는 형식 생성자 함수(예
xs:integer("5")
: )를 사용하여 수행하는 명시적 캐스팅입니다.유형 승격 중 발생하는 암시적 캐스트
명시적 캐스팅
다음 표에서는 기본 제공 기본 형식 간에 허용되는 형식 캐스팅을 간략하게 설명합니다.
표의 규칙에 따라 기본 제공 기본 유형 간에 캐스트가 가능합니다.
기본 형식은 해당 기본 형식에서 파생된 모든 형식으로 캐스팅할 수 있습니다. 예를 들어 xs:decimal에서 xs:integer로 또는 xs:decimal에서 xs:long으로 캐스팅할 수 있습니다.
파생 형식은 기본 제공 기본 형식까지 형식 계층 구조의 상위 형식인 모든 형식으로 캐스팅할 수 있습니다. 예를 들어 xs:token에서 xs:normalizedString 또는 xs:string으로 캐스팅할 수 있습니다.
파생된 유형은 해당 기본 상위 유형이 대상 유형으로 캐스팅될 수 있는 경우 기본 유형으로 캐스팅될 수 있습니다. 예를 들어 xs:decimal, xs:integer의 기본 상위 항목이 xs:string으로 캐스팅될 수 있으므로 파생 형식인 xs:integer를 xs:string, 기본 형식으로 캐스팅할 수 있습니다.
원본 형식의 기본 상위 항목이 대상 형식의 기본 상위 항목으로 캐스팅될 수 있는 경우 파생 형식을 다른 파생 형식으로 캐스팅할 수 있습니다. 예를 들어 xs:decimal에서 xs:string으로 캐스팅할 수 있으므로 xs:integer에서 xs:token으로 캐스팅할 수 있습니다.
사용자 정의 형식을 기본 제공 형식으로 캐스팅하는 규칙은 기본 제공 형식과 동일합니다. 예를 들어 xs:integer 형식에서 파생된 myInteger 형식을 정의할 수 있습니다. 그런 다음 xs:decimal을 xs:string으로 캐스팅할 수 있으므로 myInteger를 xs:token으로 캐스팅할 수 있습니다.
다음과 같은 종류의 캐스팅은 지원되지 않습니다.
목록 형식을 오가는 캐스팅은 허용되지 않습니다. 여기에는 사용자 정의 목록 형식과 xs:IDREFS, xs:ENTITIES 및 xs:NMTOKENS와 같은 기본 제공 목록 형식이 모두 포함됩니다.
xs:QName을 오가는 캐스팅은 지원되지 않습니다.
xs:NOTATION 및 완전히 정렬된 기간 하위 형식인 xdt:yearMonthDuration 및 xdt:dayTimeDuration은 지원되지 않습니다. 따라서 이러한 형식에 대한 캐스팅은 지원되지 않습니다.
다음 예제에서는 명시적 형식 캐스팅을 보여 줍니다.
예제 A
다음 예제에서는 xml 형식 변수를 쿼리합니다. 쿼리는 xs:string으로 형식화된 단순 형식 값의 시퀀스를 반환합니다.
declare @x xml
set @x = '<e>1</e><e>2</e>'
select @x.query('/e[1] cast as xs:string?')
go
예제 B
다음 예제에서는 형식화된 xml 변수를 쿼리합니다. 이 예제에서는 먼저 XML 스키마 컬렉션을 만듭니다. 그런 다음 XML 스키마 컬렉션을 사용하여 형식화된 xml 변수를 만듭니다. 스키마는 변수에 할당된 XML 인스턴스에 대한 입력 정보를 제공합니다. 그런 다음 변수에 대해 쿼리를 지정합니다.
create xml schema collection myCollection as N'
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="A" type="xs:string"/>
<xs:element name="B" type="xs:string"/>
<xs:element name="C" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
go
다음 쿼리는 문서 인스턴스에 있는 최상위 <root
> 요소 수를 모르기 때문에 정적 오류를 반환합니다.
declare @x xml(myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</baz></C>'
select @x.query('/root/A cast as xs:string?')
go
식에서 싱글톤 <root
> 요소를 지정하면 쿼리가 성공합니다. 쿼리는 xs:string으로 형식화된 단순 형식 값의 시퀀스를 반환합니다.
declare @x xml(myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</C></root>'
select @x.query('/root[1]/A cast as xs:string?')
go
다음 예제에서 xml 형식 변수에는 XML 스키마 컬렉션을 지정하는 문서 키워드가 포함됩니다. 이는 XML 인스턴스가 단일 최상위 요소가 있는 문서여야 임을 나타냅니다. XML 인스턴스에서 두 <root
> 요소를 만들면 오류가 반환됩니다.
declare @x xml(document myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>
<root><A>4</A><B>5</B><C>6</C></root>'
go
최상위 요소 하나만 포함하도록 인스턴스를 변경할 수 있으며 쿼리가 작동합니다. 다시 말하지만, 쿼리는 xs:string으로 형식화된 단순 형식 값의 시퀀스를 반환합니다.
declare @x xml(document myCollection)
set @x = '<root><A>1</A><B>2</B><C>3</C></root>'
select @x.query('/root/A cast as xs:string?')
go
암시적 캐스트
암시적 캐스팅은 숫자 형식 및 형식화되지 않은 원자성 형식에 대해서만 허용됩니다. 예를 들어 다음 min() 함수는 두 값의 최소값을 반환합니다.
min(xs:integer("1"), xs:double("1.1"))
이 예제에서 XQuery min() 함수에 전달된 두 값은 서로 다른 형식입니다. 따라서 정수 형식이 double로 승격되고 두 개의 double 값이 비교되는 경우 암시적 변환이 수행됩니다.
이 예에 설명된 대로 유형 승격은 다음 규칙을 따릅니다.
기본 제공 파생 숫자 형식은 기본 형식으로 승격될 수 있습니다. 예를 들어 정 수를 10진수로 승격할 수 있습니다.
소수점은 부동 소수점으로 승격될 수 있으며 부동 소수점은 double로 승격될 수 있습니다.
암시적 캐스팅은 숫자 형식에 대해서만 허용되므로 다음은 허용되지 않습니다.
문자열 형식에 대한 암시적 캐스팅은 허용되지 않습니다. 예를 들어 두 문자열 형식이 예상되고 문자열과 토큰을 전달하는 경우 암시적 캐스팅이 발생하지 않고 오류가 반환됩니다.
숫자 형식에서 문자열 형식으로의 암시적 캐스팅은 허용되지 않습니다. 예를 들어 문자열 형식 매개 변수가 예상되는 함수에 정수 형식 값을 전달하는 경우 암시적 캐스팅이 발생하지 않고 오류가 반환됩니다.
캐스팅 값
한 형식에서 다른 형식으로 캐스팅할 때 실제 값은 원본 형식의 값 공간에서 대상 형식의 값 공간으로 변환됩니다. 예를 들어 xs:decimal에서 xs:double로 캐스팅하면 10진수 값이 double 값으로 변환됩니다.
일부 변환 규칙은 다음과 같습니다.
문자열 또는 untypedAtomic 형식에서 값 캐스팅
문자열 또는 untypedAtomic 형식으로 캐스팅되는 값은 대상 형식의 규칙에 따라 값의 유효성을 검사하는 것과 같은 방식으로 변환됩니다. 여기에는 최종 패턴 및 공백 처리 규칙이 포함됩니다. 예를 들어 다음이 성공적으로 수행되고 double 값 1.1e0이 생성됩니다.
xs:double("1.1")
문자열 또는 untypedAtomic 형식에서 xs:base64Binary 또는 xs:hexBinary와 같은 이진 형식으로 캐스팅하는 경우 입력 값은 각각 base64 또는 16진수로 인코딩되어야 합니다.
문자열 또는 untypedAtomic 유형으로 값 캐스팅
문자열 또는 untypedAtomic 형식으로 캐스팅하면 값을 XQuery 정식 어휘 표현으로 변환합니다. 특히 이는 입력 중에 특정 패턴이나 다른 제약 조건을 준수했을 수 있는 값이 해당 제약 조건에 따라 표현되지 않음을 의미할 수 있습니다. 이에 대해 사용자에게 알리기 위해 SQL Server는 해당 형식이 스키마 컬렉션에 로드될 때 경고를 제공하여 형식 제약 조건이 문제가 될 수 있는 형식에 플래그를 지정합니다.
xs:float 유형 또는 xs:double 유형이나 그 하위 유형 중 하나의 값을 문자열 또는 untypedAtomic 유형으로 캐스팅할 때 해당 값은 과학적 표기법으로 표시됩니다. 이는 해당 값의 절대값이 1.0E-6 미만이거나 1.0E6 이상일 때만 수행됩니다. 즉, 0은 과학적 표기법으로 0.0E0으로 직렬화됩니다.
예를 들어 xs:string(1.11e1)
은 문자열 값 "11.1"
을 반환하지만 xs:string(-0.00000000002e0)
은 문자열 값 "-2.0E-11"
을 반환합니다.
xs:base64Binary 또는 xs:hexBinary와 같은 이진 형식을 문자열 또는 untypedAtomic 형식으로 캐스팅할 때 이진 값은 각각 base64 또는 16진수로 인코딩된 형식으로 표시됩니다.
숫자 형식으로 값 캐스팅
한 숫자 형식의 값을 다른 숫자 형식의 값으로 캐스팅할 때 문자열 serialization을 거치지 않고 값이 한 값 공간에서 다른 값 공간으로 매핑됩니다. 이 값이 대상 유형의 제약 조건을 충족하지 않는 경우 다음 규칙이 적용됩니다.
원본 값이 이미 숫자이고 대상 형식이 -INF 또는 INF 값을 허용하는 xs:float 또는 하위 형식이고 원본 숫자 값의 캐스팅으로 인해 오버플로가 발생하는 경우 값이 양수이면 INF에 매핑되고 값이 음수이면 -INF에 매핑됩니다. 대상 형식이 INF 또는 -INF를 허용하지 않고 오버플로가 발생하면 캐스트가 실패하고 이 SQL Server 릴리스의 결과는 빈 시퀀스입니다.
원본 값이 이미 숫자이고 대상 형식이 허용되는 값 범위에 0, -0e0 또는 0e0을 포함하는 숫자 형식이고 원본 숫자 값을 캐스팅하면 언더플로가 발생하는 경우 값은 다음과 같은 방식으로 매핑됩니다.
값은 10진수 대상 형식에 대해 0으로 매핑됩니다.
값이 음수 언더플로인 경우 값이 -0e0에 매핑됩니다.
값이 float 또는 double 대상 유형에 대한 양수 언더플로인 경우 0e0으로 매핑됩니다.
대상 유형의 값 공간에 0이 없는 경우 캐스트가 실패하고 빈 시퀀스가 나타납니다.
xs:float, xs:double 또는 해당 하위 형식 중 하나와 같은 이진 부동 소수점 형식으로 값을 캐스팅하면 전체 자릿수가 손실될 수 있습니다.
구현 제한 사항
제한 사항은 다음과 같습니다.
부동 소수점 값 NaN은 지원되지 않습니다.
캐스트 가능한 값은 대상 형식 구현 제한에 의해 제한됩니다. 예를 들어 음수 연도가 있는 날짜 문자열을 xs:date로 캐스팅할 수 없습니다. 이러한 캐스트는 런타임에 값이 제공될 경우 런타임 오류를 발생시키는 대신 빈 시퀀스를 반환합니다.