다음을 통해 공유


SequenceType 식(XQuery)

적용 대상:SQL Server

XQuery에서 값은 항상 시퀀스입니다. 값 유형을 시퀀스 유형이라고 합니다. 시퀀스 형식은 XQuery 식의 인스턴스에서 사용할 수 있습니다. XQuery 식에서 형식을 참조해야 하는 경우 XQuery 사양에 설명된 SequenceType 구문이 사용됩니다.

원자성 형식 이름은 캐스트에서 XQuery 식으로 사용할 수도 있습니다. SQL Server 에서는 SequenceTypes의 XQuery 식 인스턴스 및 캐스팅 이 부분적으로 지원됩니다.

instance of 연산자

연산자 인스턴스를 사용하여 지정된 식 값의 동적 형식 또는 런타임 형식을 확인할 수 있습니다. 예:

  
Expression instance of SequenceType[Occurrence indicator]  

연산자 instance of 인 이 Occurrence indicator연산자는 결과 시퀀스의 항목 수, 카디널리티를 지정합니다. 이 값을 지정하지 않으면 카디널리티는 1로 간주됩니다. SQL Server에서는 물음표(?) 발생 표시기만 지원됩니다. ? 발생 표시기가 0개 또는 1개의 항목을 반환할 수 있음을 Expression 나타냅니다. ? 발생 표시기를 지정 instance of 하면 싱글톤 또는 빈 시퀀스를 반환하는지 여부에 Expression 관계없이 형식이 지정된 SequenceType항목과 일치하면 True Expression 를 반환합니다.

? 발생 표시기를 지정하지 않으면 형식이 지정된 sequence of 항목과 일치 Type 하고 Expression 싱글톤을 반환하는 경우에만 Expression True를 반환합니다.

참고 SQL Server에서는 더하기 기호(+) 및 별표(*) 발생 표시기가 지원되지 않습니다.

다음 예제에서는 XQuery 연산자의 인스턴스를 사용하는 방법을보여 줍니다.

예제 A

다음 예제에서는 xml 형식 변수를 만들고 이에 대한 쿼리를 지정합니다. 쿼리 식은 첫 번째 피연산자가 반환하는 값의 동적 형식이 두 번째 피연산자에 지정된 형식과 일치하는지 여부를 결정하는 연산자를 지정 instance of 합니다.

다음 쿼리는 125 값이 지정된 형식 xs:integer의 인스턴스이므로 True를 반환합니다.

declare @x xml  
set @x=''  
select @x.query('125 instance of xs:integer')  
go  

첫 번째 피연산자의 /a[1] 식에서 반환한 값이 요소이므로 다음 쿼리는 True를 반환합니다.

declare @x xml  
set @x='<a>1</a>'  
select @x.query('/a[1] instance of element()')  
go  

마찬가지로 instance of 첫 번째 식에서 식의 값 형식이 특성이므로 다음 쿼리에서 True를 반환합니다.

declare @x xml  
set @x='<a attr1="x">1</a>'  
select @x.query('/a[1]/@attr1 instance of attribute()')  
go  

다음 예제에서 식은 data(/a[1]xdt:untypedAtomic으로 형식화된 원자성 값을 반환합니다. 따라서 instance of에서는 True를 반환합니다.

declare @x xml  
set @x='<a>1</a>'  
select @x.query('data(/a[1]) instance of xdt:untypedAtomic')  
go  

다음 쿼리에서 data(/a[1]/@attrA 식은 형식화되지 않은 원자성 값을 반환합니다. 따라서 instance of에서는 True를 반환합니다.

declare @x xml  
set @x='<a attrA="X">1</a>'  
select @x.query('data(/a[1]/@attrA) instance of xdt:untypedAtomic')  
go  

예제 B

이 예제에서는 AdventureWorks 샘플 데이터베이스에서 형식화된 XML 열을 쿼리합니다. 쿼리 중인 열과 관련된 XML 스키마 컬렉션이 형식화 정보를 제공합니다.

에서 data() 는 열과 연결된 스키마에 따라 xs:string 형식인 ProductModelID 특성의 형식화된 값을 반환합니다. 따라서 instance of에서는 True를 반환합니다.

SELECT CatalogDescription.query('  
   declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
   data(/PD:ProductDescription[1]/@ProductModelID) instance of xs:string  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

자세한 내용은 형식화된 XML과 형식화되지 않은 XML 비교를 참조하세요.

다음 쿼리는TheBoolean instance of 식을 사용하여 LocationID 특성이 xs:integer 형식인지 여부를 확인합니다.

SELECT Instructions.query('  
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   /AWMI:root[1]/AWMI:Location[1]/@LocationID instance of attribute(LocationID,xs:integer)  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID=7  

다음 쿼리는 CatalogDescription 형식의 XML 열에 대해 지정됩니다. 이 열과 연결된 XML 스키마 컬렉션은 입력 정보를 제공합니다.

쿼리는 식의 element(ElementName, ElementType?)instance of 테스트를 사용하여 특정 이름 및 형식의 요소 노드를 반환하는지 /PD:ProductDescription[1] 확인합니다.

SELECT CatalogDescription.query('  
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     /PD:ProductDescription[1] instance of element(PD:ProductDescription, PD:ProductDescription?)  
    ') as Result  
FROM  Production.ProductModel  
where ProductModelID=19  

쿼리는 True를 반환합니다.

예제 C

공용 구조체 형식 instance of 을 사용하는 경우 SQL Server의 식에는 제한 사항이 있습니다. 특히 요소 또는 특성의 형식이 공용 구조체 형식 instance of 인 경우 정확한 형식을 결정하지 못할 수 있습니다. 따라서 SequenceType에 사용되는 원자성 형식이 simpleType 계층 구조에서 식의 실제 형식 중 가장 높은 부모인 경우가 아니면 쿼리가 False를 반환합니다. 즉, SequenceType에 지정된 원자성 유형은 anySimpleType의 직계 자식이어야 합니다. 형식 계층 구조에 대한 자세한 내용은 XQuery의 형식 캐스팅 규칙을 참조하세요.

다음 쿼리 예제에서는 다음을 수행합니다.

  • 정수 또는 문자열 형식과 같은 공용 구조체 형식이 정의된 XML 스키마 컬렉션을 만듭니다.

  • XML 스키마 컬렉션을 사용하여 형식화된 xml 변수를 선언합니다.

  • 변수에 샘플 XML 인스턴스를 할당합니다.

  • 변수를 쿼리하여 공용 구조체 형식을 처리할 때의 instance of 동작을 보여 줍니다.

다음은 쿼리입니다.

CREATE XML SCHEMA COLLECTION MyTestSchema AS '  
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">  
<simpleType name="MyUnionType">  
<union memberTypes="integer string"/>  
</simpleType>  
<element name="TestElement" type="ns:MyUnionType"/>  
</schema>'  
Go  

다음 쿼리는 식에 instance of 지정된 SequenceType이 지정된 식의 실제 형식 중 가장 높은 상위 부모가 아니므로 False를 반환합니다. 즉, 값 <TestElement> 은 정수 형식입니다. 가장 높은 부모는 xs:decimal입니다. 그러나 xs:decimal는 instance of 연산자의 두 번째 피연산자로 지정되지 않습니다.

SET QUOTED_IDENTIFIER ON  
DECLARE @var XML(MyTestSchema)  
  
SET @var = '<TestElement xmlns="http://ns">123</TestElement>'  
  
SELECT @var.query('declare namespace ns="http://ns"   
   data(/ns:TestElement[1]) instance of xs:integer')  
go  

xs:integer의 가장 높은 부모는 xs:decimal이므로 쿼리를 수정하고 쿼리에서 xs:decimal을 SequenceType으로 지정하면 쿼리가 True를 반환합니다.

SET QUOTED_IDENTIFIER ON  
DECLARE @var XML(MyTestSchema)  
SET @var = '<TestElement xmlns="http://ns">123</TestElement>'  
SELECT @var.query('declare namespace ns="http://ns"     
   data(/ns:TestElement[1]) instance of xs:decimal')  
go  

예제 D

이 예제에서는 먼저 XML 스키마 컬렉션을 만들고 XML 변수를 입력하는 데 사용합니다. 그런 다음 형식화된 xml 변수를 쿼리하여 기능을 보여 instance of 줍니다.

다음 XML 스키마 컬렉션은 myType 형식의 단순 형식, myType 및 요소를 <root>정의합니다.

drop xml schema collection SC  
go  
CREATE XML SCHEMA COLLECTION SC AS '  
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="myNS" xmlns:ns="myNS"  
xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">  
      <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>  
      <simpleType name="myType">  
           <restriction base="s:varchar">  
                  <maxLength value="20"/>  
            </restriction>  
      </simpleType>  
      <element name="root" type="ns:myType"/>  
</schema>'  
Go  

이제 형식화된 xml 변수를 만들고 쿼리합니다.

DECLARE @var XML(SC)  
SET @var = '<root xmlns="myNS">My data</root>'  
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";  
declare namespace ns="myNS";   
   data(/ns:root[1]) instance of ns:myType')  
go  

myType 형식은 sqltypes 스키마 instance of 에 정의된 varchar 형식의 제한에 의해 파생되므로 True도 반환됩니다.

DECLARE @var XML(SC)  
SET @var = '<root xmlns="myNS">My data</root>'  
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";  
declare namespace ns="myNS";   
data(/ns:root[1]) instance of sqltypes:varchar?')  
go  

예제 E

다음 예제에서 식은 IDREFS 특성의 값 중 하나를 검색하고 값이 IDREF 형식인지 여부를 확인하는 데 사용합니다 instance of . 이 예제에서는 다음을 수행합니다.

  • 요소에 <>CustomerOrderList IDREFS 형식 특성이 있고 요소에 OrderID ID 형식 특성이Order<> 있는 XML 스키마 컬렉션을 만듭니다.

  • 형식화된 xml 변수를 만들고 샘플 XML 인스턴스를 할당합니다.

  • 변수에 대한 쿼리를 지정합니다. 쿼리 식은 첫 번째 OrderList IDRERS 형식 특성에서 첫 번째 <Customer>순서 ID 값을 검색합니다. 검색된 값은 IDREF 형식입니다. 따라서 instance of에서는 True를 반환합니다.

create xml schema collection SC as  
'<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:Customers="Customers" targetNamespace="Customers">  
            <element name="Customers" type="Customers:CustomersType"/>  
            <complexType name="CustomersType">  
                        <sequence>  
                            <element name="Customer" type="Customers:CustomerType" minOccurs="0" maxOccurs="unbounded" />  
                        </sequence>  
            </complexType>  
             <complexType name="OrderType">  
                <sequence minOccurs="0" maxOccurs="unbounded">  
                            <choice>  
                                <element name="OrderValue" type="integer" minOccurs="0" maxOccurs="unbounded"/>  
                            </choice>  
                </sequence>                                             
                <attribute name="OrderID" type="ID" />  
            </complexType>  
  
            <complexType name="CustomerType">  
                <sequence minOccurs="0" maxOccurs="unbounded">  
                            <choice>  
                                <element name="spouse" type="string" minOccurs="0" maxOccurs="unbounded"/>  
                                <element name="Order" type="Customers:OrderType" minOccurs="0" maxOccurs="unbounded"/>  
                            </choice>  
                </sequence>                                             
                <attribute name="CustomerID" type="string" />  
                <attribute name="OrderList" type="IDREFS" />  
            </complexType>  
 </schema>'  
go  
declare @x xml(SC)  
set @x='<CustOrders:Customers xmlns:CustOrders="Customers">  
                <Customer CustomerID="C1" OrderList="OrderA OrderB"  >  
                              <spouse>Jenny</spouse>  
                                <Order OrderID="OrderA"><OrderValue>11</OrderValue></Order>  
                                <Order OrderID="OrderB"><OrderValue>22</OrderValue></Order>  
  
                </Customer>  
                <Customer CustomerID="C2" OrderList="OrderC OrderD" >  
                                <spouse>John</spouse>  
                                <Order OrderID="OrderC"><OrderValue>33</OrderValue></Order>  
                                <Order OrderID="OrderD"><OrderValue>44</OrderValue></Order>  
  
                        </Customer>  
                <Customer CustomerID="C3"  OrderList="OrderE OrderF" >  
                                <spouse>Jane</spouse>  
                                <Order OrderID="OrderE"><OrderValue>55</OrderValue></Order>  
                                <Order OrderID="OrderF"><OrderValue>55</OrderValue></Order>  
                </Customer>  
                <Customer CustomerID="C4"  OrderList="OrderG"  >  
                                <spouse>Tim</spouse>  
                                <Order OrderID="OrderG"><OrderValue>66</OrderValue></Order>  
                        </Customer>  
                <Customer CustomerID="C5"  >  
                </Customer>  
                <Customer CustomerID="C6" >  
                </Customer>  
                <Customer CustomerID="C7"  >  
                </Customer>  
</CustOrders:Customers>'  
  
select @x.query(' declare namespace CustOrders="Customers";   
 data(CustOrders:Customers/Customer[1]/@OrderList)[1] instance of xs:IDREF ? ') as XML_result  

구현 제한 사항

제한 사항은 다음과 같습니다.

  • 스키마 요소()schema-attribute() 시퀀스 형식은 연산자와 비교할 수 instance of 없습니다.

  • 예를 들어 (1,2) instance of xs:integer*전체 시퀀스는 지원되지 않습니다.

  • 형식 이름을 지정하는 element() 시퀀스 형식의 폼을 사용하는 경우 형식은 물음표(?)로 element(ElementName, TypeName)정규화되어야 합니다. 예를 들어 element(Title, xs:string?) 요소가 null일 수 있음을 나타냅니다. SQL Server는 을 사용하여 instance ofxsi:nil 속성의 런타임 검색을 지원하지 않습니다.

  • Expression 이 공용 구조체로 입력된 요소 또는 특성에서 가져온 경우 SQL Server는 값의 형식이 파생된 기본 형식이 아닌 기본 형식만 식별할 수 있습니다. 예를 들어 정적 형식(xs:integer | xs:string)으로 정의된 경우 <e1> 다음에서는 False를 반환합니다.

    data(<e1>123</e1>) instance of xs:integer  
    

    그러나 data(<e1>123</e1>) instance of xs:decimal True를 반환합니다.

  • processing-instruction()document-node() 시퀀스 형식의 경우 인수가 없는 양식만 허용됩니다. 예를 들어 processing-instruction() 허용되지만 processing-instruction('abc') 허용되지 않습니다.

cast as 연산자

캐스트를 식으로 사용하여 값을 특정 데이터 형식으로 변환할 수 있습니다. 예:

  
Expression cast as  AtomicType?  

SQL Server에서 물음표(?)는 AtomicType. 예를 들어 다음 쿼리 "2" cast as xs:integer? 와 같이 문자열 값을 정수로 변환합니다.

declare @x xml  
set @x=''  
select @x.query('"2" cast as xs:integer?')  

다음 쿼리 에서 data() 는 문자열 형식인 ProductModelID 특성의 형식화된 값을 반환합니다. cast as연산자는 값을 xs:integer로 변환합니다.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)  
SELECT CatalogDescription.query('  
   data(/PD:ProductDescription[1]/@ProductModelID) cast as xs:integer?  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

이 쿼리에서는 데이터()명시적으로 사용할 필요가 없습니다. 식은 cast as 입력 식에서 암시적 원자화를 수행합니다.

생성자 함수

원자성 형식 생성자 함수를 사용할 수 있습니다. 예를 들어 연산"2" cast as xs:integer?자를 cast as 사용하는 대신 다음 예제와 같이 xs:integer() 생성자 함수를 사용할 수 있습니다.

declare @x xml  
set @x=''  
select @x.query('xs:integer("2")')  

다음 예제에서는 2000-01-01Z와 같은 xs:date 값을 반환합니다.

declare @x xml  
set @x=''  
select @x.query('xs:date("2000-01-01Z")')  

사용자 정의 원자성 유형에도 생성자를 사용할 수 있습니다. 예를 들어 XML 데이터 형식과 연결된 XML 스키마 컬렉션이 단순 형식 을 정의하는 경우 myType() 생성자를 사용하여 해당 형식의 값을 반환할 수 있습니다.

구현 제한 사항

  • XQuery 식은 typeswitch, 캐스트 가능처리 가 지원되지 않습니다.

  • 물음표가 필요한 대로 캐스트(?) 원자성 형식의 뒤를 입니다.

  • xs:QName 은 캐스팅에 대한 형식으로 지원되지 않습니다. 대신 expanded-QName을 사용합니다.

  • xs:date, xs:timexs:datetime 에는 Z로 표시되는 표준 시간대가 필요합니다.

    표준 시간대가 지정되지 않았으므로 다음 쿼리가 실패합니다.

    DECLARE @var XML  
    SET @var = ''  
    SELECT @var.query(' <a>{xs:date("2002-05-25")}</a>')  
    go  
    

    값에 Z 표준 시간대 표시를 추가하면 쿼리가 작동합니다.

    DECLARE @var XML  
    SET @var = ''  
    SELECT @var.query(' <a>{xs:date("2002-05-25Z")}</a>')  
    go  
    

    결과는 다음과 같습니다.

    <a>2002-05-25Z</a>  
    

참고 항목

XQuery 식
형식 시스템(XQuery)