식 컨텍스트 및 쿼리 평가(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://someURI
pd)를 선언합니다. 그러나 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
정적 컨텍스트가 초기화된 다음 쿼리 식이 분석(컴파일)됩니다. 정적 분석에는 다음이 포함됩니다.
쿼리 구문 분석 -
식에 지정된 함수 및 유형 이름 확인
쿼리의 정적 입력입니다. 이렇게 하면 쿼리 형식이 안전합니다. 예를 들어 다음 쿼리는 연산자에 숫자 기본 형식 인수가 필요하므로 정적 오류를 + 반환합니다.
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() 함수는 지원되지 않습니다.
참고 항목
XQuery 기본 사항
형식화된 XML과 형식화되지 않은 XML 비교
XML 스키마 컬렉션 [SQL Server]