형식 시스템(XQuery)
적용 대상:SQL Server
XQuery는 유형 지정이 엄격한 언어이며 형식화되지 않은 데이터에 대해서는 유형 지정이 엄격하지 않은 언어입니다. XQuery의 미리 정의된 형식은 다음과 같습니다.
네임스페이스에 있는 XML 스키마 http://www.w3.org/2001/XMLSchema 의 기본 제공 형식입니다.
네임스페이 http://www.w3.org/2004/07/xpath-datatypes 스에 정의된 형식입니다.
이 항목에서는 다음에 대해서도 설명합니다.
형식화된 값과 노드의 문자열 값입니다.
데이터 함수(XQuery) 및 문자열 함수(XQuery)입니다.
식에서 반환된 시퀀스 형식과 일치합니다.
XML 스키마의 기본 제공 유형
XML 스키마의 기본 제공 유형에는 xs의 미리 정의된 네임스페이스 접두사가 있습니다. 이러한 형식 중 일부는 xs:integer 및 xs:string입니다. 이러한 모든 기본 제공 형식이 지원됩니다. XML 스키마 컬렉션을 만들 때 이러한 형식을 사용할 수 있습니다.
형식화된 XML을 쿼리할 때 노드의 정적 및 동적 유형은 쿼리 중인 열 또는 변수와 연결된 XML 스키마 컬렉션에 의해 결정됩니다. 정적 및 동적 형식에 대한 자세한 내용은 식 컨텍스트 및 쿼리 평가(XQuery)를 참조하세요. 예를 들어 다음 쿼리는 형식화된 xml 열(Instructions
)에 대해 지정됩니다. 식은 반환된 특성의 형식화된 값이 LotSize
형식인지 xs:decimal
확인하는 데 사용합니다instance of
.
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
이 입력 정보는 열과 연결된 XML 스키마 컬렉션에서 제공합니다.
XPath 데이터 형식 네임스페이스에 정의된 형식
네임스페이 http://www.w3.org/2004/07/xpath-datatypes 스에 정의된 형식에는 xdt의 미리 정의된 접두사가 있습니다. 다음 형식이 적용됩니다.
XML 스키마 컬렉션을 만들 때는 이러한 유형을 사용할 수 없습니다. 이러한 형식은 XQuery 형식 시스템에서 사용되며 XQuery 및 정적 입력에 사용됩니다. xdt 네임스페이스에서 원자성 형식(예: xdt:untypedAtomic)으로 캐스팅할 수 있습니다.
형식화되지 않은 XML을 쿼리할 때 요소 노드의 정적 및 동적 형식은 xdt:untyped이고 특성 값의 형식은 xdt:untypedAtomic입니다. query() 메서드의 결과는 형식화되지 않은 XML을 생성합니다. 즉, XML 노드는 각각 xdt:untyped 및 xdt:untypedAtomic으로 반환됩니다.
xdt:dayTimeDuration 및 xdt:yearMonthDuration 형식은 지원되지 않습니다.
다음 예에서는 형식화되지 않은 XML 변수에 대해 쿼리가 지정됩니다. 식 , data(/a[1]
원자성 값의 시퀀스를 반환합니다. data()
함수는 <a>
요소의 형식화된 값을 반환합니다. 쿼리되는 XML은 형식화되지 않으므로 반환되는 값의 형식은 다음과 입니다 xdt:untypedAtomic
. 따라서 true를 instance of
반환합니다.
DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )
형식화된 값을 검색하는 대신 다음 예의 식(/a[1]
)은 <a>
요소의 시퀀스를 반환합니다. 식은 instance of
요소 테스트를 사용하여 식에서 반환된 값이 요소 노드 xdt:untyped type
인지 확인합니다.
DECLARE @x xml
SET @x='<a>20</a>'
-- Is this an element node whose name is "a" and type is xdt:untyped.
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')
-- Is this an element node of type xdt:untyped.
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')
-- Is this an element node?
SELECT @x.query( '/a[1] instance of element()')
참고 항목
형식화된 XML 인스턴스를 쿼리하는 경우 쿼리 식에 부모 축이 포함되어 있으면 결과 노드의 정적 형식 정보를 더 이상 사용할 수 없습니다. 그러나 동적 형식은 여전히 노드와 연결됩니다.
형식화된 값과 문자열 값 비교
모든 노드에는 형식화된 값과 문자열 값이 있습니다. 형식화된 XML 데이터의 경우 형식화된 값의 형식은 쿼리되는 열 또는 변수와 연결된 XML 스키마 컬렉션에서 제공됩니다. 형식화되지 않은 XML 데이터의 경우 형식화된 값의 형식은 xdt:untypedAtomic입니다.
data() 또는 string() 함수를 사용하여 노드의 값을 검색할 수 있습니다.
데이터 함수(XQuery)는 노드의 형식화된 값을 반환합니다.
문자열 함수(XQuery)는 노드의 문자열 값을 반환합니다.
다음 XML 스키마 컬렉션 <root
> 에서 정수 형식의 요소가 정의됩니다.
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="integer"/>
</schema>'
GO
다음 예제에서 식은 먼저 형식화된 값을 /root[1]
검색한 다음 추가 3
합니다.
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')
다음 예제에서는 식의 문자열 형식 값이 string(/root[1])
반환되므로 식이 실패합니다. 그런 다음 이 값은 숫자 형식 값만 피연산자로 사용하는 산술 연산자에 전달됩니다.
-- Fails because the argument is string type (must be numeric primitive type).
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('string(/root[1]) + 3')
다음 예제에서는 특성의 합계를 계산합니다 LaborHours
. 함수는 data()
제품 모델의 모든 요소에서 특성의 LaborHours
<Location
> 형식화된 값을 검색합니다. 열 LaborHours
과 연결된 XML 스키마에 Instruction
따르면 xs:decimal 형식입니다.
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
sum(data(//AWMI:Location/@LaborHours))
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
이 쿼리는 결과로 12.75를 반환합니다.
참고 항목
이 예제에서 data() 함수를 명시적으로 사용하는 것은 설명에만 해당합니다. 지정하지 않으면 sum()은 데이터() 함수를 암시적으로 적용하여 노드의 형식화된 값을 추출합니다.