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

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

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

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

정적 컨텍스트

정적 컨텍스트 초기화는 식에 대한 정적 분석을 위해 모든 정보를 함께 입력하는 프로세스를 의미합니다. 정적 컨텍스트 초기화의 일부로 다음과 같은 작업이 완료됩니다.

  • 경계 공백 정책이 스트립으로 설정됩니다. 따라서 경계 공백이 쿼리에 있는 any element 및 attribute 생성자에 의해 보존되지 않습니다. 예를 들면 다음과 같습니다.

    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는 네임스페이스(http://someURI)에 바인딩하는 접두사(pd)를 선언합니다. 하지만 WHERE 절에서 쿼리 프롤로그가 이 바인딩을 무효화합니다.

      WITH XMLNAMESPACES ('http://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-time 및 fn:current-dateTime은 지원되지 않습니다.

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

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

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

참고 항목

참조

XML 스키마 컬렉션 [SQL Server]

개념

형식화된 XML과 형식화되지 않은 XML 비교

관련 자료

XQuery 기초