다음을 통해 공유


식 컨텍스트 및 쿼리 평가(XQuery)

적용 대상: SQL Server

식의 컨텍스트는 식을 분석 및 평가하는 데 사용되는 정보입니다. 다음은 XQuery가 평가되는 두 단계입니다.

  • 정적 컨텍스트 - 쿼리 컴파일 단계입니다. 사용 가능한 정보에 따라 일부 경우에 이러한 쿼리 정적 분석 중에 오류가 발생할 수 있습니다.

  • 동적 컨텍스트 - 쿼리 실행 단계입니다. 쿼리 컴파일 중 오류와 같은 정적 오류가 쿼리에 없더라도 쿼리는 실행 중에 오류를 반환할 수 있습니다.

정적 컨텍스트

정적 컨텍스트 초기화는 식의 정적 분석을 위해 모든 정보를 결합하는 프로세스를 나타냅니다. 정적 컨텍스트 초기화의 일부로 다음이 완료됩니다.

  • 경계 공백 정책이 제거되도록 설정됩니다. 따라서 경계 공백은 쿼리의 요소특성 생성자에 의해 유지되지 않습니다. 예시:

    declare @x xml  
    set @x=''  
    select @x.query('<a>  {"Hello"}  </a>,  
    
        <b> {"Hello2"}  </b>')  
    

    XQuery 식을 구문 분석하는 동안 경계 공간이 제거되므로 이 쿼리는 다음 결과를 반환합니다.

    <a>Hello</a><b>Hello2</b>  
    
  • 접두사 및 네임스페이스 바인딩은 다음에 대해 초기화됩니다.

    • 미리 정의된 네임스페이스 집합입니다.

    • WITH XMLNAMESPACES를 사용하여 정의된 모든 네임스페이스입니다. 자세한 내용은 WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가)를 참조하세요.

    • 쿼리 프롤로그에 정의된 모든 네임스페이스입니다. 프롤로그에 있는 네임스페이스 선언은 WITH XMLNAMESPACES에 있는 네임스페이스 선언을 무효화할 수 있습니다. 예를 들어 다음 쿼리에서 WITH XMLNAMESPACES는 네임스페이스()에 바인딩하는 접두사(https://someURIpd)를 선언합니다. 그러나 WHERE 절에서 쿼리 프롤로그는 바인딩을 재정의합니다.

      WITH XMLNAMESPACES ('https://someURI' AS pd)  
      SELECT ProductModelID, CatalogDescription.query('  
          <Product   
              ProductModelID= "{ sql:column("ProductModelID") }"   
              />  
      ') AS Result  
      FROM Production.ProductModel  
      WHERE CatalogDescription.exist('  
          declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           /pd:ProductDescription[(pd:Specifications)]'  
          ) = 1  
      

    이러한 모든 네임스페이스 바인딩은 정적 컨텍스트 초기화 중에 확인됩니다.

  • 형식화된 xml 열 또는 변수를 쿼리하는 경우 열 또는 변수와 연결된 XML 스키마 컬렉션의 구성 요소를 정적 컨텍스트로 가져옵니다. 자세한 내용은 형식화된 XML과 형식화되지 않은 XML 비교를 참조하세요.

  • 가져온 스키마에 있는 모든 원자 유형에 대해 정적 컨텍스트에서 캐스트 함수를 사용할 수도 있습니다. 다음 예에서 확인할 수 있습니다. 이 예제에서는 형식 화된 xml 변수에 대해 쿼리를 지정합니다. 이 변수와 연결된 XML 스키마 컬렉션은 원자성 형식인 myType을 정의합니다. 이 형식에 해당하는 캐스팅 함수인 myType()은 정적 분석 중에 사용할 수 있습니다. 쿼리 식(ns:myType(0))은 myType의 값을 반환합니다.

    -- 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="int">  
                 <enumeration value="0" />  
                  <enumeration value="1"/>  
                </restriction>  
          </simpleType>  
          <element name="root" type="ns:myType"/>  
    </schema>'  
    go  
    
    DECLARE @var XML(SC)  
    SET @var = '<root xmlns="myNS">0</root>'  
    -- specify myType() casting function in the query  
    SELECT @var.query('declare namespace ns="myNS"; ns:myType(0)')  
    

    다음 예제에서는 int 기본 제공 XML 형식에 대한 캐스팅 함수가 식에 지정됩니다.

    declare @x xml  
    set @x = ''  
    select @x.query('xs:int(5)')  
    go  
    

정적 컨텍스트가 초기화된 다음 쿼리 식이 분석(컴파일)됩니다. 정적 분석에는 다음이 포함됩니다.

  1. 쿼리 구문 분석 -

  2. 식에 지정된 함수 및 유형 이름 확인

  3. 쿼리의 정적 입력입니다. 이렇게 하면 쿼리 형식이 안전합니다. 예를 들어 다음 쿼리는 연산자에 숫자 기본 형식 인수가 필요하므로 정적 오류를 + 반환합니다.

    declare @x xml  
    set @x=''  
    SELECT @x.query('"x" + 4')  
    

    다음 예제 에서 value() 연산자에는 싱글톤이 필요합니다. XML 스키마에 지정된 대로 여러 <Elem> 요소가 있을 수 있습니다. 식에 대한 정적 분석은 식의 안정성 여부와 정적 오류의 반환 여부를 확인합니다. 오류를 해결하려면 식을 다시 작성하여 싱글톤(data(/x:Elem)[1])을 명시적으로 지정해야 합니다.

    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"/>  
          <element name="Elem" type="string"/>  
    </schema>'  
    go  
    
    declare @x xml (SC)  
    set @x='<Elem xmlns="myNS">test</Elem><Elem xmlns="myNS">test2</Elem>'  
    SELECT @x.value('declare namespace x="myNS"; data(/x:Elem)[1]','varchar(20)')  
    

    자세한 내용은 XQuery 및 정적 입력을 참조 하세요.

구현 제한 사항

정적 컨텍스트와 관련된 제한 사항은 다음과 같습니다.

  • XPath 호환성 모드는 지원되지 않습니다.

  • XML 생성의 경우 스트립 생성 모드만 지원됩니다. 이것이 기본 설정입니다. 따라서 생성된 요소 노드의 형식은 xdt:untyped 형식이고 특성은 xdt:untypedAtomic 형식입니다.

  • 순서가 지정된 순서 지정 모드만 지원됩니다.

  • 스트립 XML 공간 정책만 지원됩니다.

  • 기본 URI 기능은 지원되지 않습니다.

  • fn:doc() 는 지원되지 않습니다.

  • fn:collection() 은 지원되지 않습니다.

  • XQuery 정적 플래그는 제공되지 않습니다.

  • xml 데이터 형식과 연결된 데이터 정렬이 사용됩니다. 이 데이터 정렬은 항상 유니코드 코드 포인트 데이터 정렬로 설정됩니다.

동적 컨텍스트

동적 컨텍스트는 식을 실행할 때 제공되어야 하는 정보를 의미합니다. 정적 컨텍스트 외에도 다음 정보는 동적 컨텍스트의 일부로 초기화됩니다.

  • 컨텍스트 항목, 컨텍스트 위치 및 컨텍스트 크기와 같은 식 포커스는 다음과 같이 초기화됩니다. 이러한 모든 값은 nodes() 메서드에 의해 재정의될 수 있습니다.

    • xml 데이터 형식은 처리 중인 노드인 컨텍스트 항목을 문서 노드로 설정합니다.

    • 처리 중인 노드를 기준으로 컨텍스트 항목의 위치인 컨텍스트 위치가 먼저 1로 설정됩니다.

    • 처리 중인 시퀀스의 항목 수인 컨텍스트 크기는 항상 하나의 문서 노드가 있기 때문에 먼저 1로 설정됩니다.

구현 제한 사항

다음은 동적 컨텍스트와 관련된 제한 사항입니다.

  • 현재 날짜 및 시간 컨텍스트 함수인 fn:current-date, fn:current-timefn:current-dateTime은 지원되지 않습니다.

  • 암시적 표준 시간대는 UTC+0으로 고정되며 변경할 수 없습니다.

  • fn:doc() 함수는 지원되지 않습니다. 모든 쿼리는 xml 형식 열 또는 변수에 대해 실행됩니다.

  • fn:collection() 함수는 지원되지 않습니다.

참고 항목

XQuery 기본 사항
형식화된 XML과 형식화되지 않은 XML 비교
XML 스키마 컬렉션 [SQL Server]