Typy danych XPath (SQLXML 4.0)
Microsoft SQL Server, XPath, and XML Schema (XSD) have very different data types.Na przykład XPath nie ma typu danych integer lub data, ale SQL Server i XSD ma wiele.XSD używa nanosekund precyzji dla czas wartości, i SQL Server korzysta z dokładnością co najwyżej 1/300 sekundy.W konsekwencji mapowanie danych jednego typu do drugiego nie zawsze jest możliwe.Aby uzyskać więcej informacji o mapowaniu SQL Server danych typów danych XSD, zobacz Coercions typ danych i sql:datatype adnotacji (SQLXML 4.0).
Wyrażenie XPath ma trzy typy danych: string, number, and boolean.number Typ danych jest zawsze IEEE 754 podwójnej precyzji zmiennoprzecinkowych.The SQL Server float(53) data type is the closest to XPath number.Jednakże float(53) jest dokładnie IEEE 754.Na przykład używany jest NaN (nie na numer) ani nieskończoności.Próbując konwertować ciąg znaków nienumerycznych do number i próby dzielenia przez zero wyniki w błąd.
Konwersje XPath
Kiedy używać kwerendę XPath takich jak OrderDetail[@UnitPrice > "10.0"], dane niejawne i jawne konwersje typów można zmienić znaczenie kwerendy w subtelne sposoby.Dlatego ważne jest zrozumienie sposobu implementacji typów danych XPath.Specyfikacja języka XPath, język XML Path Language (XPath) w wersja 1.0 W3C proponowane zalecenie dnia 8 października 1999 r., można znaleźć w witrynie W3C witryna sieci Web na http://www.w3.org/TR/1999/PR-xpath-19991008.html.
Operatorzy XPath są podzielone na cztery kategorie:
wartość logicznaoperatory (i, lub)
Relational operators (<, >, <=, >=)
Operatory równości (=,! =)
Operatory arytmetyczne (+, -, *, div mod)
Każda kategoria operator konwertuje argumentów inaczej.Operatory XPath niejawnie konwertować ich argumentów, w razie potrzeby.Operatory arytmetyczne konwertowania ich argumentów do numberoraz wynik w wartości liczbowe.Operatory logiczne konwertowania ich argumentów do booleanoraz wynik w wartości typu wartość logiczna.Operatory relacyjne i równości operatory skutkować wartość logiczna.Jednakże mają reguły konwersji różne w zależności od ich operandów oryginalne typy danych pokazanych w tej tabela.
Operand |
Operator relacyjny |
Operator równości |
|---|---|---|
Oba operandy są zestawy węzła. |
Wartość TRUE tylko wtedy, gdy w jeden zestaw jest węzłem i zestawem węzłów w drugim, takie że porównanie ich string wartości jest TRUE. |
Ten sam. |
Zestaw węzłów, drugi jest string. |
PRAWDZIWY tylko wtedy, gdy jest w węzeł - węzełzestaw takie, że po przekonwertowaniu do number, porównanie z string konwertowane na number jest TRUE. |
PRAWDZIWY tylko wtedy, gdy jest w węzeł - węzełzestaw takie, że po przekonwertowaniu do string, porównanie z string jest TRUE. |
Zestaw węzłów, drugi jest number. |
PRAWDZIWY tylko wtedy, gdy jest w węzeł - węzełzestaw takie, że po przekonwertowaniu do number, porównanie z number jest TRUE. |
Ten sam. |
Zestaw węzłów, drugi jest boolean. |
PRAWDZIWY tylko wtedy, gdy jest w węzeł - węzełzestaw takie, że po przekonwertowaniu do boolean i następnie number, porównanie z boolean konwertowane na number jest TRUE. |
PRAWDZIWY tylko wtedy, gdy jest w węzeł - węzełzestaw takie, że po przekonwertowaniu do boolean, porównanie z boolean jest TRUE. |
Ani to zestaw węzłów. |
Konwertowanie oba operandy do number , a następnie porównaj. |
Konwertowanie oba operandy typu wspólnego, a następnie porównaj.Konwertuj na boolean Jeżeli albo jest boolean, number Jeżeli albo jest number; w przeciwnym razie konwersja na string. |
Ostrzeżenie
Ponieważ operatory relacyjne XPath zawsze Konwertuj ich argumentów do number, string porównania są możliwe.Aby dołączyć data porównań, SQL Server 2000 oferuje takie zróżnicowanie specyfikacji XPath: Gdy operator relacyjny porównuje string do string, zestaw węzłów do string, lub ciąg-wyceniane zestaw węzłów do ciąg-wyceniane zestawu węzłów, string porównania (nie number porównania) jest wykonywana.
Konwersje zestaw węzłów
Konwersje zestaw węzłów nie zawsze są intuicyjne.Zestaw węzłów jest konwertowany na string przyjmując wartość ciąg tylko pierwszego węzła w zestawie.Zestaw węzłów jest konwertowany na number konwertując go do string, a następnie przekonwertować string do number.Zestaw węzłów jest konwertowany na boolean przez badania dla jego istnienia.
Ostrzeżenie
SQL Servernie wykonuje pozycyjne zaznaczenia na węźle zestawy: na przykład, kwerenda XPath Customer[3] oznacza klienta trzeciego; Ten typ zaznaczenia pozycyjne nie jest obsługiwany w SQL Server.Therefore, the node-set-to-string or node-set-to-number conversions as described by the XPath specification are not implemented.SQL Server uses "any" semantics wherever the XPath specification specifies "first" semantics.Na przykład, oparte na specyfikacji W3C XPath kwerendę XPath Order[OrderDetail/@UnitPrice > 10.0] wybiera tych zamówień z pierwszym OrderDetail ma CenaJednostkowa większa niż 10.0.W SQL Server, ta kwerenda XPath wybiera tych zamówień z dowolnym OrderDetail z CenaJednostkowa większa niż 10.0.
Konwersja na boolean generuje istnienia badania; Dlatego też kwerenda XPath Products[@Discontinued=true()] jest równoważne wyrażenie języka SQL "Products.Discontinued nie jest null", nie wyrażenie języka SQL "Products.Discontinued = 1".Aby kwerenda równoważne tym drugim wyrażenie języka SQL, przekonwertować zestaw węzłów nie-boolean Typ, taki jak number.Na przykład Products[number(@Discontinued) = true()].
Ponieważ większość operatorów są definiowane PRAWDA, jeśli są PRAWDZIWE dla dowolnego lub jednego z węzłów w zestawie węzłów, operacje te zawsze oceniać wartość FALSE, jeśli zestaw węzłów jest pusty.Zatem, jeśli jest pusta, A oba A = B i A != B mają wartość FALSE, i not(A=B) i not(A!=B) jest TRUE.
Zazwyczaj, atrybut lub element, który jest mapowany do kolumna, jeżeli wartość kolumna bazy danych nie jest null.Elementy, które mapują wierszy istnieć, jeśli istnieją ich dzieci.Aby uzyskać więcej informacji, zobacz Za pomocą sql:relation (schematu XDR) i Za pomocą sql:pole (schematu XDR).
Ostrzeżenie
Adnotacje elementy z is-constant zawsze istnieje.W rezultacie predykaty XPath nie mogą być używane na is-constant elementów.Aby uzyskać więcej informacji, zobacz Tworzenie stała sql przy użyciu elementów: jest-stała (schematu XDR).
Gdy zestaw węzłów jest konwertowany na string lub number, jego typ XDR (jeśli istnieje) jest kontrolowane w schemacie adnotacjami i typu jest używana do określenia konwersji, która jest wymagana.
Mapowania typów danych XDR typy danych XPath
Typ danych XPath węzła jest pochodną XDR typu danych w schemacie, jak pokazano w poniższej tabela (węzeł BusinessEntityID jest używana w celu ilustracyjny).
Typ danych XDR |
Odpowiednik Typ danych XPath |
Konwersja programu SQL Server używane |
|---|---|---|
Nonebin.base64bin.hex |
Brak |
BrakBusinessEntityID |
wartość logiczna |
wartość logiczna |
Konwertowanie (bit, BusinessEntityID) |
Liczba, int, float, i1, i2, i4, i8, r4, r8ui1, ui2, ui4, ui8 |
liczba |
Convert(float(53), BusinessEntityID) |
Identyfikator idref, idrefsentity, podmioty, enumerationnotation, nmtoken, nmtokens, chardate, Timedate, Time.tz, ciąg identyfikatora uri, uuid |
ciąg |
Convert(nvarchar(4000), BusinessEntityID, 126) |
fixed14.4 |
Brak (występuje brak typu danych w języku XPath, który jest równoważny typowi danych XDR fixed14.4) |
Konwertowanie (pieniędzy, BusinessEntityID) |
data |
ciąg |
Left(Convert(nvarchar(4000), BusinessEntityID, 126) 10) |
godzina czas.TZ |
ciąg |
SUBSTRING(Convert(nvarchar(4000), BusinessEntityID, 126), 1 + CHARINDEX (NT ", CONVERT(nvarchar(4000), BusinessEntityID, 126)), 24) |
The date and time conversions are designed to work whether the value is stored in the database using the SQL Server datetime data type or a string.Note that the SQL Server datetime data type does not use timezone and has a smaller precision than the XML time data type.Aby uwzględnić timezone Typ danych lub precision dodatkowe przechowywania danych w SQL Server za pomocą string typu.
Dodatkowe konwersji węzła jest konwertowana z jego XDR typu danych na typ XPath, czasami jest konieczne (z jednego typu danych XPath na inny typ danych XPath).Rozważmy na przykład tę kwerendę XPath:
(@m + 3) = 4
Jeśli jest @ m fixed14.4 typ XDR danych, konwersja z typu danych XDR typ danych jest realizowane przy użyciu XPath:
CONVERT(money, m)
W tej konwersji węzeł m jest konwertowana z fixed14.4 do money.Dodawanie wartości 3, wymaga jednak dodatkowe konwersji:
CONVERT(float(CONVERT(money, m))
Wyrażenie XPath jest oceniane jako:
CONVERT(float(CONVERT(money, m)) + CONVERT(float(53), 3) = CONVERT(float(53), 3)
Jak pokazano w poniższej tabela, jest tym samym konwersji dla innych wyrażeń XPath (takich jak literały lub złożonych wyrażeń).
|
X jest nieznany |
X jest string |
X jest number |
X jest boolean |
ciąg(X) |
Konwertowanie (X 126 nvarchar(4000)) |
- |
Konwertowanie (X 126 nvarchar(4000)) |
GDY SPRAWA X, a następnie N'true " ELSE N'false " KONIEC |
Number(X) |
Konwertowanie (float(53), X) |
Konwertowanie (float(53), X) |
- |
PRZYPADEK X 1 NASTĘPNIE KONIEC ELSE 0 |
Boolean(X) |
- |
LEN(X) > 0 |
X! = 0 |
- |
Przykłady
A.Konwersja typu danych w kwerendzie XPath
W następującej kwerendzie XPath określone przed adnotacjami schematu XSD kwerenda wybiera wszystkie pracownika węzły z BusinessEntityID atrybut wartość E-1, gdzie "E-" jest określony przy użyciu prefiksu sql:id-prefix adnotacji.
Employee[@BusinessEntityID="E-1"]
Predykat w kwerendzie jest równoważne wyrażenie języka SQL:
N'E-' + CONVERT(nvarchar(4000), Employees.BusinessEntityID, 126) = N'E-1'
Ponieważ BusinessEntityID jest jednym z id ()idref, idrefs, nmtoken, nmtokensi tak dalej) typ danych wartości w schematu XSD BusinessEntityID jest konwertowany na string XPath typ danych przy użyciu reguły konwersji, opisane wcześniej.
CONVERT(nvarchar(4000), Employees.BusinessEntityID, 126)
"E-" Prefiks jest dodawany ciąg, a wyniki porównywane z N'E-1'.
B.Wykonać kilka konwersje typów danych w kwerendzie XPath
Należy uwzględnić tę kwerendę XPath przed adnotacjami schematu XSD: OrderDetail[@UnitPrice * @OrderQty > 98]
Ta kwerenda XPath zwraca wszystkie <OrderDetail> elementy spełniające orzeczenie @UnitPrice * @OrderQty > 98.Jeśli CenaJednostkowa adnotacje z fixed14.4 Typ danych w schemacie adnotacjami ten predykat jest równoważne wyrażenie języka SQL:
CONVERT(float(53), CONVERT(money, OrderDetail.UnitPrice)) * CONVERT(float(53), OrderDetail.OrderQty) > CONVERT(float(53), 98)
Konwersja wartości w kwerendzie XPath, pierwszy konwersji konwertuje XDR typ danych na typ XPath.Ponieważ typ danych XSD CenaJednostkowa jest fixed14.4, jak opisano w poprzedniej tabela, jest to pierwszy konwersji, która jest używana:
CONVERT(money, OrderDetail.UnitPrice))
Ponieważ operatory arytmetyczne przekonwertować ich argumentów do number Typ danych XPath, drugi konwersji (z jednego typu danych XPath na inny typ danych XPath) jest stosowany w którym wartości są konwertowane na float(53) ()float(53) jest bliska XPath number Typ danych):
CONVERT(float(53), CONVERT(money, OrderDetail.UnitPrice))
Zakładając, że OrderQty nie typ danych XSD ma atrybut OrderQty jest konwertowany na number XPath typ danych w pojedynczym konwersji:
CONVERT(float(53), OrderDetail.OrderQty)
Podobnie, wartość 98 jest konwertowana na number Typ danych XPath:
CONVERT(float(53), 98)
Ostrzeżenie
Jeśli typ danych XSD w schemacie jest niezgodny z podstawową SQL Server danych w bazie danych, wpisz lub Jeśli konwersja typów niemożliwe dane wyrażenie XPath jest wykonywana, SQL Server może zwracać błąd.Na przykład jeśli BusinessEntityID atrybut dolaczone z id-prefix adnotacji XPath Employee[@BusinessEntityID=1] generuje błąd, ponieważ BusinessEntityID ma id-prefix adnotacji i nie można przekonwertować na number.