XPath 데이터 형식(SQLXML 4.0)
적용 대상: SQL ServerAzure SQL Database
Microsoft SQL Server, XPath 및 XSD(XML 스키마)에는 매우 다른 데이터 형식이 있습니다. 예를 들어 XPath에는 정수 또는 날짜 데이터 형식이 없지만 SQL Server 및 XSD에는 많은 형식이 있습니다. XSD는 시간 값에 나노초 정밀도를 사용하고 SQL Server는 최대 1/300초 정밀도를 사용합니다. 따라서 한 데이터 형식을 다른 데이터 형식에 매핑하는 것이 항상 가능한 것은 아닙니다. SQL Server 데이터 형식을 XSD 데이터 형식 에 매핑하는 방법에 대한 자세한 내용은 데이터 형식 강제 변환 및 sql:datatype 주석(SQLXML 4.0)을 참조하세요.
XPath에는 문자열, 숫자 및 부울의 세 가지 데이터 형식이 있습니다. 숫자 데이터 형식은 항상 IEEE 754 배정밀도 부동 소수점입니다. SQL Serverfloat(53) 데이터 형식은 XPath 번호와 가장 가깝습니다. 그러나 float(53) 는 정확히 IEEE 754가 아닙니다. 예를 들어 NaN(숫자가 아님) 또는 무한대는 사용되지 않습니다. 숫자가 아닌 문자열을 숫자로 변환하고 0으로 나누려고 하면 오류가 발생합니다.
XPath 변환
암시적 및 명시적 데이터 형식 변환과 같은 OrderDetail[@UnitPrice > "10.0"]
XPath 쿼리를 사용하는 경우 쿼리의 의미를 미묘한 방식으로 변경할 수 있습니다. 따라서 XPath 데이터 형식이 구현되는 방식을 이해하는 것이 중요합니다. XPath 언어 사양인 XPath(XML Path Language) 버전 1.0 W3C 제안 권장 사항 8 1999년 10월 8일은 W3C 웹 사이트에서 http://www.w3.org/TR/1999/PR-xpath-19991008.html찾을 수 있습니다.
XPath 연산자는 다음 네 가지 범주로 나뉩니다.
부울 연산자(및 또는)
관계형 연산자(<, >, <=, >=)
같음 연산자(=, !=)
산술 연산자(+, -, *, div, mod)
연산자의 각 범주는 피연산자를 다르게 변환합니다. XPath 연산자는 필요한 경우 피연산자를 암시적으로 변환합니다. 산술 연산자는 피연산자를 숫자로 변환하고 숫자 값을 생성합니다. 부울 연산자는 피연산자를 부울로 변환하고 부울 값을 생성합니다. 관계형 연산자와 같음 연산자는 부울 값을 생성합니다. 그러나 다음 표에서 볼 수 있듯이 피연산자의 원래 데이터 형식에 따라 서로 다른 변환 규칙이 적용됩니다.
피연산자 | 관계형 연산자 | 같음 연산자 |
---|---|---|
두 피연산자는 모두 노드 집합입니다. | 한 집합에 노드가 있고 두 번째 집합에 노드가 있는 경우에만 TRUE이면 해당 문자열 값의 비교가 TRUE입니다. | 같은. |
하나는 노드 집합이고 다른 하나는 문자열입니다. | 숫자로 변환할 때 숫자로 변환된 문자열과의 비교가 TRUE인 노드 집합에 노드가 있는 경우에만 TRUE입니다. | 문자열로 변환할 때 문자열과 비교 하는 노드 집합에 노드가 있는 경우에만 TRUE입니다. |
하나는 노드 집합이고 다른 하나는 숫자입니다. | 숫자로 변환할 때 숫자와 비교하는 노드 집합에 노드가 있는 경우에만 TRUE입니다. | 같은. |
하나는 노드 집합이고 다른 하나는 부울입니다. | 부울로 변환한 다음 숫자로 변환할 때 숫자로 변환된 부울 과 비교하는 노드 집합에 노드가 있는 경우에만 TRUE입니다. | 부울로 변환할 때 부울과 비교 하는 노드 집합에 노드가 있는 경우에만 TRUE입니다. |
둘 모두 노드 집합이 아닙니다. | 두 피연산자를 숫자로 변환한 다음 비교합니다. | 두 피연산자를 공통 형식으로 변환한 다음 비교합니다. 둘 중 하나가 부울이면 부울로 변환하고, 숫자 중 하나가 숫자이면 숫자로 변환하고, 그렇지 않으면 문자열로 변환합니다. |
참고 항목
XPath 관계형 연산자는 항상 피연산자를 숫자로 변환하므로 문자열 비교는 불가능합니다. 날짜 비교를 포함하기 위해 SQL Server 2000은 XPath 사양에 대한 이러한 변형을 제공합니다. 관계형 연산자가 문자열과 문자열을 비교하거나, 노드 집합을 문자열로 설정하거나, 문자열 반환 노드 집합을 문자열 반환 노드 집합으로 비교하면 문자열 비교(숫자 비교 아님)가 수행됩니다.
노드 집합 변환
노드 집합 변환이 항상 직관적인 것은 아닙니다. 노드 집합은 집합에서 첫 번째 노드의 문자열 값만 가져와 문자열로 변환됩니다. 노드 집합은 문자열로 변환한 다음 문자열을 숫자로 변환하여 숫자로 변환됩니다. 노드 집합은 해당 존재 여부를 테스트하여 부울 로 변환됩니다.
참고 항목
SQL Server는 노드 집합에서 위치 선택을 수행하지 않습니다. 예를 들어 XPath 쿼리 Customer[3]
는 세 번째 고객을 의미합니다. 이러한 유형의 위치 선택은 SQL Server에서 지원되지 않습니다. 따라서 XPath 사양에 설명된 대로 노드 집합-문자열 또는 노드 집합-숫자 변환은 구현되지 않습니다. SQL Server는 XPath 사양이 "첫 번째" 의미 체계를 지정하는 모든 위치에서 "any" 의미 체계를 사용합니다. 예를 들어 W3C XPath 사양에 따라 XPath 쿼리 Order[OrderDetail/@UnitPrice > 10.0]
는 UnitPrice가 10.0보다 큰 첫 번째 OrderDetail을 사용하여 해당 주문을 선택합니다. SQL Server에서 이 XPath 쿼리는 UnitPrice가 10.0보다 큰 OrderDetail을 사용하여 해당 주문을 선택합니다.
부울로 변환하면 존재 테스트가 생성되므로 XPath 쿼리 Products[@Discontinued=true()]
는 SQL 식 "Products.Discontinued = 1"이 아니라 "Products.Discontinued가 null이 아닙니다"라는 SQL 식과 동일합니다. 쿼리를 후자의 SQL 식과 같게 하려면 먼저 노드 집합을 숫자와 같은 부울이 아닌 형식으로 변환합니다. 예들 들어 Products[number(@Discontinued) = true()]
입니다.
대부분의 연산자는 노드 집합의 노드 중 하나 또는 하나에 대해 TRUE인 경우 TRUE로 정의되므로 노드 집합이 비어 있는 경우 이러한 연산은 항상 FALSE로 평가됩니다. 따라서 A가 비어 있고 둘 다 A = B
FALSE이고 A != B
not(A=B)
not(A!=B)
TRUE인 경우
일반적으로 데이터베이스에서 해당 열의 값이 null이 아닌 경우 열에 매핑되는 특성 또는 요소가 존재합니다. 행에 매핑되는 요소는 자식이 있는 경우 존재합니다.
참고 항목
is 상수로 주석이 추가된 요소는 항상 존재합니다. 따라서 is 상수 요소에서는 XPath 조건자를 사용할 수 없습니다.
노드 집합이 문자열 또는 숫자로 변환되면 주석이 추가된 스키마에서 해당 XDR 형식(있는 경우)이 검사되고 해당 형식은 필요한 변환을 결정하는 데 사용됩니다.
XDR 데이터 형식을 XPath 데이터 형식에 매핑
노드의 XPath 데이터 형식은 다음 표와 같이 스키마의 XDR 데이터 형식에서 파생됩니다(노드 EmployeeID 는 설명 용도로 사용됨).
XDR 데이터 형식 | 해당 XPath 데이터 형식 |
사용되는 SQL Server 변환 |
---|---|---|
Nonebin.base64bin.hex | 해당 없음 | NoneEmployeeID |
부울 값 | 부울 값 | CONVERT(bit, EmployeeID) |
number, int, float,i1, i2, i4, i8,r4, r8ui1, ui2, ui4, ui8 | number | CONVERT(float(53), EmployeeID) |
id, idref, idrefsentity, entities, enumerationnotation, nmtoken, nmtokens, chardate, Timedate, Time.tz, string, uri, uuid | string | CONVERT(nvarchar(4000), EmployeeID, 126) |
fixed14.4 | 해당 사항 없음(XPath에는 fixed14.4 XDR 데이터 형식에 해당하는 데이터 형식이 없음) | CONVERT(money, EmployeeID) |
date | string | LEFT(CONVERT(nvarchar(4000), EmployeeID, 126), 10) |
시간 time.tz |
string | SUBSTRING(CONVERT(nvarchar(4000), EmployeeID, 126), 1 + CHARINDEX(N'T', CONVERT(nvarchar(4000), EmployeeID, 126)), 24) |
날짜 및 시간 변환은 값이 SQL Serverdatetime 데이터 형식 또는 문자열을 사용하여 데이터베이스에 저장되는지 여부를 작동하도록 설계되었습니다. SQL Server날짜/시간 데이터 형식은 표준 시간대를 사용하지 않으며 XML 시간 데이터 형식보다 정밀도가 작습니다. 표준 시간대 데이터 형식 또는 추가 정밀도를 포함하려면 문자열 형식을 사용하여 SQL Server에 데이터를 저장합니다.
노드가 XDR 데이터 형식에서 XPath 데이터 형식으로 변환되는 경우 한 XPath 데이터 형식에서 다른 XPath 데이터 형식으로의 추가 변환이 필요한 경우도 있습니다. 예를 들어 다음 XPath 쿼리를 고려합니다.
(@m + 3) = 4
fixed14.4 XDR 데이터 형식인 경우 @m 다음을 사용하여 XDR 데이터 형식에서 XPath 데이터 형식으로 변환합니다.
CONVERT(money, m)
이 변환에서 노드 m
는 fixed14.4에서 money로 변환됩니다. 그러나 3 값을 추가하려면 추가 변환이 필요합니다.
CONVERT(float(CONVERT(money, m))
XPath 식은 다음과 같이 평가됩니다.
CONVERT(float(CONVERT(money, m)) + CONVERT(float(53), 3) = CONVERT(float(53), 3)
다음 표와 같이 다른 XPath 식(예: 리터럴 또는 복합 식)에 적용되는 것과 동일한 변환입니다.
X는 알 수 없는 형식입니다. | X는 문자열입니다. | X는 숫자입니다. | X는 부울입니다. | |
---|---|---|---|---|
string(X) | CONVERT (nvarchar(4000), X, 126) | - | CONVERT (nvarchar(4000), X, 126) | CASE WHEN X THEN N'true' ELSE N'false' END |
number(X) | CONVERT(float(53), X) | CONVERT(float(53), X) | - | CASE WHEN X THEN 1 ELSE 0 END |
boolean(X) | - | LEN(X) > 0 | X != 0 | - |
예제
A. XPath 쿼리에서 데이터 형식 변환
주석이 추가된 XSD 스키마에 대해 지정된 다음 XPath 쿼리에서 쿼리는 EmployeeID 특성 값이 E-1인 모든 Employee 노드를 선택합니다. 여기서 "E-"는 sql:id-prefix 주석을 사용하여 지정된 접두사입니다.
Employee[@EmployeeID="E-1"]
쿼리의 조건자는 SQL 식과 동일합니다.
N'E-' + CONVERT(nvarchar(4000), Employees.EmployeeID, 126) = N'E-1'
EmployeeID는 XSD 스키마의 ID(idref, idrefs, nmtoken, nmtokens 등) 데이터 형식 값 중 하나이므로 EmployeeID는 앞에서 설명한 변환 규칙을 사용하여 문자열 XPath 데이터 형식으로 변환됩니다.
CONVERT(nvarchar(4000), Employees.EmployeeID, 126)
"E-" 접두사는 문자열에 추가되고 결과는 .와 N'E-1'
비교됩니다.
B. XPath 쿼리에서 몇 가지 데이터 형식 변환 수행
주석이 추가된 XSD 스키마에 대해 지정된 이 XPath 쿼리를 고려합니다. OrderDetail[@UnitPrice * @OrderQty > 98]
이 XPath 쿼리는 조건자를 <만족하는 모든 OrderDetail> 요소를 반환합니다 @UnitPrice * @OrderQty > 98
. 주석이 추가된 스키마에서 UnitPrice에 고정된 14.4 데이터 형식으로 주석이 추가된 경우 이 조건자는 SQL 식과 동일합니다.
CONVERT(float(53), CONVERT(money, OrderDetail.UnitPrice)) * CONVERT(float(53), OrderDetail.OrderQty) > CONVERT(float(53), 98)
XPath 쿼리의 값을 변환할 때 첫 번째 변환은 XDR 데이터 형식을 XPath 데이터 형식으로 변환합니다. UnitPrice의 XSD 데이터 형식은 이전 표에 설명된 대로 14.4로 고정되어 있으므로 사용되는 첫 번째 변환입니다.
CONVERT(money, OrderDetail.UnitPrice))
산술 연산자는 피연산자를 숫자 XPath 데이터 형식으로 변환하기 때문에 두 번째 변환(한 XPath 데이터 형식에서 다른 XPath 데이터 형식으로)이 적용되어 값이 float(53)(float(53)가 XPath 숫자 데이터 형식에 가깝습니다.
CONVERT(float(53), CONVERT(money, OrderDetail.UnitPrice))
OrderQty 특성에 XSD 데이터 형식이 없다고 가정하면 OrderQty는 단일 변환에서 숫자 XPath 데이터 형식으로 변환됩니다.
CONVERT(float(53), OrderDetail.OrderQty)
마찬가지로 값 98은 숫자 XPath 데이터 형식으로 변환됩니다.
CONVERT(float(53), 98)
참고 항목
스키마에 사용된 XSD 데이터 형식이 데이터베이스의 기본 SQL Server 데이터 형식과 호환되지 않거나 불가능한 XPath 데이터 형식 변환이 수행되면 SQL Server에서 오류를 반환할 수 있습니다. 예를 들어 EmployeeID 특성에 ID 접두사 주석이 주석으로 추가되면 EmployeeID에 ID 접두사 주석이 있고 숫자로 변환할 수 없으므로 XPath Employee[@EmployeeID=1]
에서 오류가 발생합니다.