원자화(XQuery)
원자화는 항목의 유형 값을 추출하는 프로세스입니다. 이 프로세스는 특정 상황에서 적용됩니다. 산술 및 비교 연산자와 같은 일부 XQuery 연산자는 이 프로세스에 따라 달라집니다. 예를 들어 산술 연산자를 노드에 직접 적용하면 data 함수를 암시적으로 호출하여 노드의 유형 값이 먼저 검색됩니다. 이렇게 하면 원자 값이 피연산자로 산술 연산자에 전달됩니다.
예를 들어 다음 쿼리는 LaborHours 특성의 합계를 반환합니다. 이 경우 **data()**는 암시적으로 특성 노드에 적용됩니다.
declare @x xml
set @x='<ROOT><Location LID="1" SetupTime="1.1" LaborHours="3.3" />
<Location LID="2" SetupTime="1.0" LaborHours="5" />
<Location LID="3" SetupTime="2.1" LaborHours="4" />
</ROOT>'
-- data() implicitly applied to the attribute node sequence.
SELECT @x.query('sum(/ROOT/Location/@LaborHours)')
data() 함수가 필수적인 것은 아니지만 명시적으로 지정할 수도 있습니다.
SELECT @x.query('sum(data(ROOT/Location/@LaborHours))')
암시적 원자화의 다른 예는 산술 연산자를 사용할 경우입니다. + 연산자를 사용하려면 원자 값이 필요하며 **data()**는 LaborHours 특성의 원자 값을 검색하는 데 암시적으로 적용됩니다. 쿼리는 ProductModel 테이블에 있는 xml 유형의 Instructions 열에 대해 지정됩니다. 다음 쿼리는 LaborHours 특성을 3번 반환합니다. 쿼리에서 다음에 유의하십시오.
- OrignialLaborHours 특성을 구성할 때 원자화는 (
$WC/@LaborHours
)에서 반환된 단일 시퀀스에 암시적으로 적용됩니다. LaborHours 특성의 유형 값은 OrignialLaborHours에 할당됩니다. - UpdatedLaborHoursV1 특성을 구성할 때 산술 연산자에 원자 값이 필요합니다. 따라서 data() 는 (
$WC/@LaborHours
)에서 반환된 LaborHours 특성에 암시적으로 적용됩니다. 그런 다음 원자 값 1이 추가됩니다. UpdatedLaborHoursV2 특성의 구성은 **data()**의 명시적 응용 프로그램을 보여 주지만 필수는 아닙니다.
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in /AWMI:root/AWMI:Location[1]
return
<WC OriginalLaborHours = "{ $WC/@LaborHours }"
UpdatedLaborHoursV1 = "{ $WC/@LaborHours + 1 }"
UpdatedLaborHoursV2 = "{ data($WC/@LaborHours) + 1 }" >
</WC>') as Result
FROM Production.ProductModel
where ProductModelID=7
다음은 결과입니다.
<WC OriginalLaborHours="2.5"
UpdatedLaborHoursV1="3.5"
UpdatedLaborHoursV2="3.5" />
원자화 결과 단순 유형 인스턴스, 빈 집합 또는 정적 유형 오류가 생성됩니다.
또한 원자화는 함수에 전달된 비교 식 매개 변수, 함수에서 반환된 값, cast() 식 및 order by 절에 전달된 순서 식에서 발생합니다.