XQuery의 캐스트 규칙Type Casting Rules in XQuery

적용 대상: 예SQL Server(2012부터) 아니요Azure SQL Database 아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server (starting with 2012) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

다음 W3C XQuery 1.0 및 XPath 2.0 함수 및 연산자 사양 다이어그램에서는 기본 제공 기본 유형 및 파생된 유형을 포함한The following W3C XQuery 1.0 and XPath 2.0 Functions and Operators specifications diagram shows the built-in data types. 기본 제공 데이터 형식을 보여 줍니다.This includes the built-in primitive and built-in derived types.

XQuery 1.0 유형 계층XQuery 1.0 type hierarchy

이 항목에서는 다음 중 한 가지 방법으로 유형 간 변환할 때 적용되는 캐스트 규칙에 대해 설명합니다.This topic describes the type casting rules that are applied when casting from one type to another by using one of the following methods:

  • 명시적 캐스트를 사용 하 여 수행한 로 캐스팅 또는 유형 생성자 함수 (예를 들어 xs:integer("5")).Explicit casting that you do by using cast as or the type constructor functions (for example, xs:integer("5")).

  • 유형 승격 중 발생하는 암시적 캐스트Implicit casting that occurs during type promotion

명시적 캐스트Explicit Casting

다음 표에서는 기본 제공 기본 유형 간에 허용되는 캐스트에 대한 개요를 보여 줍니다.The following table outlines the allowed type casting between the built-in primitive types.

XQuery에 대 한 캐스팅 규칙을 설명합니다. Describes casting rules for XQuery.

  • 표의 규칙에 따라 기본 제공 기본 유형 간에 캐스트가 가능합니다.A built-in primitive type can cast to another built-in primitive type, based on the rules in the table.

  • 기본 유형은 해당 기본 유형에서 파생된 모든 유형으로 캐스팅될 수 있습니다.A primitive type can be cast to any type derived from that primitive type. 예를 들어에서 캐스팅할 수 있습니다 xs: decimalxs: integer, 또는 xs: decimalxs: long합니다.For example, you can cast from xs:decimal to xs:integer, or from xs:decimal to xs:long.

  • 파생된 유형은 기본 제공 기본 유형에 이르기까지 유형 계층에서 상위에 있는 모든 유형으로 캐스팅될 수 있습니다.A derived type can be cast to any type that is its ancestor in the type hierarchy, all the way up to its built-in primitive base type. 예를 들어에서 캐스팅할 수 있습니다 xs:tokenxs: normalizedstring 또는 xs: string합니다.For example, you can cast from xs:token to xs:normalizedString or to xs:string.

  • 파생된 유형은 해당 기본 상위 유형이 대상 유형으로 캐스팅될 수 있는 경우 기본 유형으로 캐스팅될 수 있습니다.A derived type can be cast to a primitive type if its primitive ancestor can be cast to the target type. 예를 들어 캐스팅할 수 있습니다 xs: integer, 파생 형식에 xs: string원시 하기 때문에 입력 xs: decimal, xs: integer의 기본 상위로 캐스팅할 수 있습니다 xs: string합니다.For example, you can cast xs:integer, a derived type, to an xs:string, primitive type, because xs:decimal, xs:integer's primitive ancestor, can be cast to xs:string.

  • 파생된 유형은 원본 유형의 기본 상위 유형이 대상 유형의 기본 상위 유형으로 캐스팅될 경우 다른 파생된 유형으로 캐스팅될 수 있습니다.A derived type can be cast to another derived type if the source type's primitive ancestor can be cast to the target type's primitive ancestor. 예를 들어에서 캐스팅할 수 있습니다 xs: integerxs:token이므로에서 캐스팅할 수 있습니다 xs: decimalxs: string합니다.For example, you can cast from xs:integer to xs:token, because you can cast from xs:decimal to xs:string.

  • 사용자 정의 유형을 기본 제공 유형으로 캐스팅하는 규칙은 기본 제공 유형에 대한 규칙과 같습니다.The rules for casting user-defined types to built-in types are the same as for the built-in types. 예를 들어 정의할 수 있습니다는 myInteger 에서 파생 된 형식 xs: integer 형식입니다.For example, you can define a myInteger type derived from xs:integer type. 차례로 myInteger 캐스팅할 수 xs:token이므로 xs: decimal 캐스팅할 수 xs: string합니다.Then, myInteger can be cast to xs:token, because xs:decimal can be cast to xs:string.

    다음은 지원되지 않는 캐스트의 종류입니다.The following kinds of casting are not supported:

  • 목록 유형과의 상호 캐스트는 허용되지 않습니다.Casting to or from list types is not allowed. 사용자 정의 목록 유형 및 기본 제공 목록 유형이 모두 같은 포함 xs:IDREFS하십시오 xs: entities, 및 xs: nmtokens.This includes both user-defined list types and built-in list types such as xs:IDREFS, xs:ENTITIES, and xs:NMTOKENS.

  • 캐스팅 xs: qname 지원 되지 않습니다.Casting to or from xs:QName is not supported.

  • xs: notation 및 기간 완벽 하 게 정렬 된 하위 xdt: yearmonthduration 하 고 xdt: daytimeduration, 지원 되지 않습니다.xs:NOTATION and the fully ordered subtypes of duration, xdt:yearMonthDuration and xdt:dayTimeDuration, are not supported. 따라서 이러한 유형과의 상호 캐스트는 지원되지 않습니다.As a result, casting to or from these types is not supported.

    다음 예에서는 명시적 캐스트를 보여 줍니다.The following examples illustrate explicit type casting.

예 1Example A

다음 예에서는 xml 유형 변수를 쿼리합니다.The following example queries an xml type variable. 이 쿼리는 xs:string으로 형식화된 단순 유형 값의 시퀀스를 반환합니다.The query returns a sequence of a simple type value typed as xs:string.

declare @x xml  
set @x = '<e>1</e><e>2</e>'  
select @x.query('/e[1] cast as xs:string?')  
go  

예 2Example B

다음 예에서는 형식화된 xml 변수를 쿼리합니다.The following example queries a typed xml variable. 먼저 XML 스키마 컬렉션을 만든 다음The example first creates an XML schema collection. 그 XML 스키마 컬렉션을 사용하여 형식화된 xml 변수를 만듭니다.It then uses the XML schema collection to create a typed xml variable. 이 스키마에서는 해당 변수에 할당된 XML 인스턴스에 대한 형식화 정보를 제공합니다.The schema provides the typing information for the XML instance assigned to the variable. 그러면 해당 변수에 대해 쿼리가 지정됩니다.Queries are then specified against the variable.

create xml schema collection myCollection as N'  
<xs:schema xmlns:xs="https://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> 요소의 수를 알 수 없기 때문입니다.The following query returns a static error, because you do not know how many top level <root> elements are in the document instance.

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> 요소를 지정하면 쿼리가 수행됩니다.By specifying a singleton <root> element in the expression, the query succeeds. 이 쿼리는 xs:string으로 형식화된 단순 유형 값의 시퀀스를 반환합니다.The query returns a sequence of a simple type value typed as 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 스키마 컬렉션을 지정하는 문서 키워드가 포함됩니다.In the following example, the xml type variable includes a document keyword that specifies the XML schema collection. 이는 XML 인스턴스가 단일 최상위 수준의 요소가 있는 문서여야 한다는 의미입니다.This indicates that the XML instance must be a document that has a single top-level element. XML 인스턴스에 <root> 요소를 두 개 만들면 오류가 반환됩니다.If you create two <root> elements in the XML instance, it will return an error.

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  

최상위 수준의 요소를 하나만 포함하도록 인스턴스를 변경하면 쿼리가 작동합니다.You can change the instance to include only one top level element and the query works. 이 쿼리는 xs:string으로 형식화된 단순 유형 값의 시퀀스를 다시 반환합니다.Again, the query returns a sequence of a simple type value typed as 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  

암시적 캐스트Implicit Casting

암시적 캐스트는 숫자 유형 및 형식화되지 않은 원자 유형에 대해서만 허용됩니다.Implicit casting is allowed only for numeric types and untyped atomic types. 다음 예를 들어 min () 함수는 두 값의 최소값을 반환 합니다.For example, the following min() function returns the minimum of the two values:

min(xs:integer("1"), xs:double("1.1"))  

이 예제에서는 두 개의 값 전달 xquery min () 함수는 다른 유형입니다.In this example, the two values passed in to the XQuery min() function are of different types. 암시적 변환을 수행 하므로 여기서 정수 형식으로 승격 됩니다 double 및 두 개의 double 값이 비교 됩니다.Therefore, implicit conversion is performed where integer type is promoted to double and the two double values are compared.

이 예에 설명된 대로 유형 승격은 다음 규칙을 따릅니다.The type promotion as described in this example follows these rules:

  • 기본 제공 파생된 숫자 유형은 기본 유형으로 승격될 수 있습니다.A built-in derived numeric type may be promoted to its base type. 예를 들어 정수 로 승격 decimal합니다.For example, integer may be promoted to decimal.

  • A 10 진수 로 승격 될 수 있습니다 floatfloat 로 승격 될 수 있습니다 double합니다.A decimal may be promoted to float, and a float may be promoted to double.

    암시적 캐스트는 숫자 유형에 대해서만 허용되므로 다음은 허용되지 않습니다.Because implicit casting is allowed only for numeric types, the following is not allowed:

  • 문자열 유형에 대한 암시적 캐스트는 허용되지 않습니다.Implicit casting for string types is not allowed. 예를 들어, 두 문자열 형식을 예상 되 고 전달 하는 문자열토큰없는 암시적 캐스트가 수행 하 고 오류가 반환 됩니다.For example, if two string types are expected and you pass in a string and a token, no implicit casting occurs and an error is returned.

  • 숫자 유형에서 문자열 유형으로 암시적 캐스팅하는 것은 허용되지 않습니다.Implicit casting from numeric types to string types is not allowed. 예를 들어 정수 유형 값을 문자열 유형 매개 변수를 예상하는 함수로 전달하는 경우 암시적 캐스트가 발생하지 않고 오류가 반환됩니다.For example, if you pass an integer type value to a function that is expecting a string type parameter, no implicit casting occurs and an error is returned.

값 캐스팅Casting values

한 유형에서 다른 유형으로 캐스팅할 때 실제 값은 원본 유형의 값 공간에서 대상 유형의 값 공간으로 변환됩니다.When casting from one type to another, the actual values are transformed from the source type's value space to the target type's value space. 예를 들어 xs:decimal에서 xs:double로 캐스팅하면 decimal 값이 double 값으로 변환됩니다.For example, casting from an xs:decimal to an xs:double will transform the decimal value into a double value.

일부 변환 규칙은 다음과 같습니다.Following are some of the transformation rules.

문자열 또는 untypedAtomic 유형에서 값 캐스팅Casting a value from a string or untypedAtomic type

문자열 또는 untypedAtomic 유형으로 캐스팅되는 값은 대상 유형의 규칙에 따라 값의 유효성을 검사하는 것과 같은 방법으로 변환됩니다.The value that is being cast to a string or untypedAtomic type is transformed in the same manner as validating the value based on the target type's rules. 여기에는 결과 패턴 및 공백 처리 규칙이 포함됩니다.This includes eventual pattern and white-space processing rules. 예를 들어 다음이 성공적으로 수행되고 double 값 1.1e0이 생성됩니다.For example, the following will succeed and generate a double value, 1.1e0:

xs:double("1.1")

문자열 또는 untypedAtomic 유형에서 xs:base64Binary 또는 xs:hexBinary와 같은 이진 유형으로 캐스팅할 때 입력 값은 각각 Base64 또는 16진수 인코딩이어야 합니다.When casting to binary types such as xs:base64Binary or xs:hexBinary from a string or untypedAtomic type, the input values have to be base64 or hex encoded, respectively.

문자열 또는 untypedAtomic 유형으로 값 캐스팅Casting a value to a string or untypedAtomic type

문자열 또는 untypedAtomic 유형으로 캐스팅하면 값이 XQuery 정식 어휘 표현으로 변환됩니다.Casting to a string or untypedAtomic type transforms the value to its XQuery canonical lexical representation. 이는 특히 입력 중 특정 패턴이나 기타 제약 조건에 맞는 값이 해당 제약 조건에 따라 표현되지 않음을 의미합니다.Specifically, this can mean that a value that may have obeyed a specific pattern or other constraint during input will not be represented according to that constraint. 이 대 한 사용자를 알려 줍니다 SQL ServerSQL Server 형식 제약 조건 스키마 컬렉션에 해당 형식이 로드 될 때 경고를 제공 하 여는 문제가 될 수 있는 형식 플래그를 지정 합니다.To inform users about this, SQL ServerSQL Server flags types where the type constraint can be a problem by providing a warning when those types are loaded into the schema collection.

xs:float 유형 또는 xs:double 유형이나 그 하위 유형 중 하나의 값을 문자열 또는 untypedAtomic 유형으로 캐스팅할 때 해당 값은 과학적 표기법으로 표시됩니다.When casting a value of type xs:float or xs:double, or any one of their subtypes, to a string or untypedAtomic type, the value is represented in scientific notation. 이는 해당 값의 절대값이 1.0E-6 미만이거나 1.0E6 이상일 때만 수행됩니다.This is done only when the value's absolute value is less than 1.0E-6, or greater than or equal to 1.0E6. 즉, 과학적 표기법에 따라 0이 0.0E0으로 직렬화됩니다.This means that 0 is serialized in scientific notation to 0.0E0.

예를 들어 xs:string(1.11e1)은 문자열 값 "11.1"을 반환하지만 xs:string(-0.00000000002e0)은 문자열 값 "-2.0E-11"을 반환합니다.For example, xs:string(1.11e1) will return the string value "11.1", while xs:string(-0.00000000002e0) will return the string value, "-2.0E-11".

xs:base64Binary 또는 xs:hexBinary와 같은 이진 유형을 문자열 또는 untypedAtomic 유형으로 캐스팅할 때 이진 값은 각각 Base64 또는 16진수 인코딩 형식으로 표현됩니다.When casting binary types, such as xs:base64Binary or xs:hexBinary, to a string or untypedAtomic type, the binary values will be represented in their base64 or hex encoded form, respectively.

숫자 유형으로 값 캐스팅Casting a value to a numeric type

하나의 숫자 유형 값을 다른 숫자 유형 값으로 캐스팅할 때 값은 문자열 직렬화를 거치지 않고 하나의 값 공간에서 다른 값 공간으로 매핑됩니다.When casting a value of one numeric type to a value of another numeric type, the value is mapped from one value space to the other without going through string serialization. 이 값이 대상 유형의 제약 조건을 충족하지 않는 경우 다음 규칙이 적용됩니다.If the value does not satisfy the constraint of a target type, the following rules apply:

  • 원본 값이 이미 숫자이고 대상 유형이 xs:float이거나 -INF 또는 INF 값을 허용하는 그 하위 유형이며 원본 숫자 값의 캐스트에 따라 오버플로가 발생하는 경우 해당 값이 양수일 때는 값이 INF로 매핑되고 해당 값이 음수일 때는 -INF로 매핑됩니다.If the source value is already numeric and the target type is either xs:float or a subtype thereof that allows -INF or INF values, and casting of the source numeric value would result in an overflow, the value is mapped to INF if the value is positive or -INF if the value is negative. 대상 유형에서 INF 또는 -INF를 허용하지 않고 오버플로가 발생하는 경우 캐스트는 실패하고 이 SQL Server 릴리스에서는 결과가 빈 시퀀스로 표시됩니다.If the target type does not allow INF or -INF, and an overflow would occur, the cast fails and the result in this release of SQL Server is the empty sequence.

  • 원본 값이 이미 숫자이고 대상 유형이 승인된 값 범위 내에 0, -0e0 또는 0e0을 포함하는 숫자 유형이며 원본 숫자 값의 캐스트에 따라 언더플로가 발생하는 경우 해당 값은 다음 방식으로 매핑됩니다.If the source value is already numeric and the target type is a numeric type that includes 0, -0e0, or 0e0 in its accepted value range, and casting of the source numeric value would result in an underflow, the value is mapped in the following ways:

    • decimal 대상 유형의 경우 값이 0으로 매핑됩니다.The value is mapped to 0 for a decimal target type.

    • 값이 음수 언더플로인 경우 -0e0으로 매핑됩니다.The value is mapped to -0e0 when the value is a negative underflow.

    • 값이 float 또는 double 대상 유형에 대한 양수 언더플로인 경우 0e0으로 매핑됩니다.The value is mapped to 0e0 when the value is a positive underflow for a float or double target type.

      대상 유형의 값 공간에 0이 없는 경우 캐스트가 실패하고 빈 시퀀스가 나타납니다.If the target type does not include zero in its value space, the cast fails and the result is the empty sequence.

      xs:float, xs:double 또는 이들의 하위 유형 중 하나와 같은 이진 부동 소수점 유형으로 값을 캐스팅하는 경우 전체 자릿수가 줄어들 수 있습니다.Note that casting a value to a binary floating point type, such as xs:float, xs:double, or any one of their subtypes, may lose precision.

구현 시 제한 사항Implementation Limitations

제한 사항은 다음과 같습니다.These are the limitations:

  • 부동 소수점 값 NaN은 지원되지 않습니다.The floating point value NaN is not supported.

  • 캐스팅할 수 있는 값은 대상 유형 구현 제한 사항으로 제한됩니다.Castable values are restricted by the target types implementation restrictions. 예를 들어에 음수 연도가 있는 날짜 문자열로 캐스팅할 수 없습니다 xs: date합니다.For example, you cannot cast a date string with a negative year to xs:date. 이러한 캐스트는 런타임에 값이 제공될 경우 런타임 오류를 발생시키는 대신 빈 시퀀스를 반환합니다.Such casts will result in the empty sequence if the value is provided at run time (instead of raising a run-time error).

관련 항목See Also

XML 데이터 직렬화 정의Define the Serialization of XML Data