Udostępnij przez


Typy danych XPath (SQLXML 4.0)

Microsoft SQL Server, XPath, and XML Schema (XSD) have very different data types.Na przykład, wyrażenie XPath nie ma typu danych Liczba całkowita lub data, ale SQL Server a XSD ma wiele. XSD używa precyzji nanosecond dla wartości czas i SQL Server używa precyzji co najwyżej 1/300-sekundy. W związku z tym mapowanie danych jednego typu do innego nie zawsze jest możliwe.Aby uzyskać więcej informacji na temat mapowania SQL Server typy danych do typów danych XSD, zobacz Coercions typ danych i sql:datatype adnotacja (SQLXML 4.0).

Wyrażenie XPath ma trzy typy danych: string, number, a boolean. The number data type is always an IEEE 754 double-precision floating-point.The SQL Server float(53) data type is the closest to XPath number.Jednak float(53) nie równa się IEEE 754. Na przykład NaN (nie nieliczbowych) ani nieskończoności jest używany.Podjęto próbę konwersji ciąg nienumeryczne do number a próba dzielenia przez zero powoduje błąd.

Wyrażenie XPath Conversions

Kiedy używać kwerendy XPath takich jak OrderDetail[@UnitPrice > "10.0"], dane niejawne i jawne konwersje typów może zmienić znaczenie kwerendy w sposób subtelnych. Dlatego ważne jest zrozumienie sposobu implementacji XPath typów danych.Specyfikacja języka XPath (XML ścieżka Language (XPath) w wersja 1.0 W3C propozycji zalecenie 8 października 1999 roku, można znaleźć witryna sieci Web konsorcjum W3C http://www.w3.org/TR/1999/PR-xpath-19991008.html.

Wyrażenie XPath operatory są podzielone na cztery kategorie:

  • Operatory logiczne (i, lub)

  • Operatory relacyjne)<, >, <=, >=)

  • Operatory równości (=),! =)

  • Operatory arytmetyczne (+,-, *, div mod)

Każda kategoria operator konwertuje argumentów inaczej.Operatory XPath niejawnie konwertować ich argumentów, jeśli to konieczne.Operatory arytmetyczne konwertowania ich argumentów do number, a wynikiem jest wartość numeru. Operatory logiczne konwertowania ich argumentów do boolean, a wynikiem jest logiczny. Operatory relacyjne i operatorów równości spowodować logiczny.Jednak mają reguły konwersji różne w zależności od typów danych oryginalnego ich operandów, jak to zostało pokazane w tej tabela.

Argument operacji

Operator relacyjny

Operator równości

Obydwa argumenty są zestawami węzłów.

Wartość TRUE, wtedy i tylko wtedy, gdy w jeden zestaw nie ma węzła i ustaw węzeł w drugim, takie to porównanie ich string wartości ma wartość PRAWDA.

Takie same.

Jest jeden zestaw węzłów, drugą string.

Wartość TRUE, wtedy i tylko wtedy, gdy zestaw węzłów nie ma węzła taki sposób, że po przekonwertowaniu do number, porównanie z string konwertowane na number ma wartość PRAWDA.

Wartość TRUE, wtedy i tylko wtedy, gdy zestaw węzłów nie ma węzła taki sposób, że po przekonwertowaniu do string, porównanie z string ma wartość PRAWDA.

Jest jeden zestaw węzłów, drugą number.

Wartość TRUE, wtedy i tylko wtedy, gdy zestaw węzłów nie ma węzła taki sposób, że po przekonwertowaniu do number, porównanie z number ma wartość PRAWDA.

Takie same.

Jest jeden zestaw węzłów, drugą boolean.

Wartość TRUE, wtedy i tylko wtedy, gdy zestaw węzłów nie ma węzła taki sposób, że po przekonwertowaniu do boolean a następnie number, porównanie z boolean konwertowane na number ma wartość PRAWDA.

Wartość TRUE, wtedy i tylko wtedy, gdy zestaw węzłów nie ma węzła taki sposób, że po przekonwertowaniu do boolean, porównanie z boolean ma wartość PRAWDA.

Nie jest zestaw węzłów.

Oba argumenty do konwersji number a następnie porównać.

Konwertowanie oba argumenty typu wspólnego, a następnie porównaj.Konwertowanie na boolean Jeśli jest jeden boolean, number Jeśli jest jeden number; w przeciwnym razie konwersja na string.

Uwaga

Ponieważ operatory relacyjne XPath zawsze Konwertuj ich argumentów do number, string porównania nie jest możliwe. Aby dołączyć data porównań, program SQL Server 2000 oferują tej zmiany ze specyfikacją XPath: Kiedy operator relacyjny porównuje string Aby string, zestaw węzłów do string, lub wartości ciąg zestaw węzłów do wartości ciąg zestaw węzłów, string Porównanie (nie number wykonywane jest porównanie).

Node-zestaw Conversions

Konwertowanie zestaw węzłów nie zawsze są intuicyjne.Zestaw węzłów jest konwertowany na string w zestawie, biorąc pod uwagę wartość ciąg pierwszego węzła. Zestaw węzłów jest konwertowany na number przez jej do konwertowania string, a następnie konwersji string Aby number. Zestaw węzłów jest konwertowany na boolean testując jego istnienia.

Uwaga

SQL Server nie wykonuje pozycyjne wybór zestawu węzłów: na przykład wyrażenie XPath kwerendy Customer[3] oznacza trzeci odbiorcy; 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 oparty na specyfikacji W3C XPath, kwerendy XPath Order[OrderDetail/@UnitPrice > 10.0] powoduje zaznaczenie tych zamówień z pierwszego OrderDetail maCenaJednostkowa większe niż 10.0.W SQL Server, tę kwerendę XPath powoduje zaznaczenie wszystkich zamówień OrderDetail maCenaJednostkowa większe niż 10.0.

Konwersja na boolean generuje istnienia test; dlatego kwerendy XPath Products[@Discontinued=true()]jest odpowiednikiem wyrażenie języka SQL "Products.Discontinued nie jest null", nie wyrażenie języka SQL "Products.Discontinued = 1". Aby wprowadzić kwerendę odpowiadającej ostatnie wyrażenie języka SQL, najpierw przekonwertować zestaw węzłów różna-boolean Wpisz, na przykład number. Na przykład Products[number(@Discontinued) = true()].

Ponieważ większość podmiotów gospodarczych są zdefiniowane jako PRAWDA, jeśli mają wartość PRAWDA, dla jednego lub jeden z węzłów w zestawie węzłów, operacje te zawsze ocenić wartość FAŁSZ, jeśli zestaw węzłów jest pusty.W ten sposób, jeśli A jest pusta, oba A = B i A != B mają wartość FALSE, a not(A=B) i not(A!=B) mają wartość PRAWDA.

Zazwyczaj atrybut lub element, który jest mapowany do kolumna występuje, jeżeli nie jest wartością tej kolumna w bazie danych null. Elementy, które są mapowane na wiersze istnieć, jeśli istnieje dowolny ich elementy podrzędne.Aby uzyskać więcej informacji, zobacz Za pomocą sql:relation (schematu XDR) i Za pomocą sql:pole (schematu XDR).

Uwaga

Elementy odnotowany z is-constant zawsze istnieje. W związku z tym predykaty XPath nie mogą być używane w is-constant elementy. Aby uzyskać więcej informacji zobaczTworzenie stałej elementy przy użyciu języka sql: stała się (schematu XDR).

Kiedy na zestaw węzłów string lub number, jego typ XDR (jeśli istnieje) jest kontrolowane w schemacie adnotacjami i tego typu służy do określania konwersji, które są wymagane.

Mapowanie typów danych XDR na typy danych XPath

Typ danych XPath węzła jest ustalana na podstawie typu danych XDR w schemacie, jak pokazano w poniższej tabela (węzeł Pole IDPracownika jest używana w celu przykładowy).

Typ danych XDR

Odpowiednik

Typ danych XPath

Konwersja programu SQL Server używany

Nonebin.base64bin.hex

NIE DOTYCZY

BrakPole IDPracownika

logiczny

logiczny

CONVERT (bit, IDPracownika)

numer, int, float, i1, i2, i4, i8, r4, r8ui1, ui2, ui4, ui8

numer

CONVERT(float(53) IDPracownika)

ID, idref, idrefsentity, podmioty, enumerationnotation, nmtoken, nmtokens, chardate, Timedate czas.tz, ciąg znaków, identyfikator uri, uuid

ciąg znaków

CONVERT(nvarchar(4000), IDPracownika, 126)

fixed14.4

N/A(There is no data type in XPath that is equivalent to the fixed14.4 XDR data type)

CONVERT (pieniędzy, IDPracownika)

data

ciąg znaków

LEFT(CONVERT(nvarchar(4000), EmployeeID, 126), 10)

godzina

czas.TZ

ciąg znaków

SUBSTRING(CONVERT(nvarchar(4000), EmployeeID, 126), 1 + CHARINDEX(N'T', CONVERT(nvarchar(4000), EmployeeID, 126)), 24)

The date and time conversions are designed to work whether the value is stored in the database using the SQL Serverdatetime data type or a string.Note that the SQL Serverdatetime data type does not use timezone and has a smaller precision than the XML time data type.Aby dołączyć timezone Typ danych lub dodatkowe precyzji przechowywania danych w SQL Server za pomocą string Typ.

Gdy węzeł jest konwertowana z jego typu danych XDR na typ XPath, dodatkowe konwersji czasami jest konieczne (z jednego typu danych XPath na inny typ danych XPath).Na przykład należy wziąć pod uwagę tę kwerendę XPath:

(@m + 3) = 4

Jeśli jest @ m fixed14.4 Typ XDR danych, konwersja z typu danych XDR na wyrażenie XPath, typ danych jest wykonywane przy użyciu:

CONVERT(money, m)

W tej konwersji, węzeł m jest konwertowany z fixed14.4 Aby 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 to ten sam konwersji, która jest stosowana dla innych wyrażeń XPath (takich jak literały i złożonych wyrażeniach).

 

X jest nieznany

X to string

X to number

X to boolean

ciąg(X)

CONVERT (X 126 nvarchar(4000))

-

CONVERT (X 126 nvarchar(4000))

przypadek, gdy X THEN N'true 'N'false ELSE' END

Number(X)

CONVERT (float(53), X)

CONVERT (float(53), X)

-

PRZYPADEK, GDY X 1 NASTĘPNIE ZAKOŃCZENIA ELSE 0

logiczny(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łów o Pole IDPracownika wartość atrybut E-1, gdzie "E-" jest określona za pomocą prefiksusql:id-prefix adnotacja.

Employee[@EmployeeID="E-1"]

Predykat w kwerendzie jest odpowiednikiem wyrażenie języka SQL:

N'E-' + CONVERT(nvarchar(4000), Employees.EmployeeID, 126) = N'E-1'

Ponieważ Pole IDPracownika jest jednym z id (idref, idrefs, nmtoken, nmtokensi tak dalej) typ danych wartości w schematu XSD Pole IDPracownika jest konwertowanastring Typ danych wyrażenie XPath przy użyciu reguł konwersji opisany powyżej.

CONVERT(nvarchar(4000), Employees.EmployeeID, 126)

Prefiks "" E-"jest dodawany do ciąg, a następnie porównuje się wyniki z N'E-1'.

B.Wykonać kilka konwersje typów danych w kwerendzie XPath

Należy wziąć pod uwagę tę kwerendę XPath przed adnotacjami schematu XSD: OrderDetail[@UnitPrice * @OrderQty > 98]

Tę kwerendę XPath zwraca wszystkie <OrderDetail> elementy spełniające predykatu @UnitPrice * @OrderQty > 98. Jeśli CenaJednostkowa jest odnotowany z fixed14.4 Typ danych w schemacie adnotacjami ten predykat jest odpowiednikiem wyrażenie języka SQL:

CONVERT(float(53), CONVERT(money, OrderDetail.UnitPrice)) * CONVERT(float(53), OrderDetail.OrderQty) > CONVERT(float(53), 98)

W konwertowania wartości w kwerendzie XPath w pierwszej konwersji konwertuje XDR typu danych na typ XPath.Ponieważ typ danych XSD CenaJednostkowa is fixed14.4, jak opisano w poprzedniej tabela, jest to pierwszy konwersji, który jest używany:

CONVERT(money, OrderDetail.UnitPrice)) 

Ponieważ operatory arytmetyczne przekonwertować ich argumentów do number Wpisz dane wyrażenie 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 zbliżony do wyrażenia XPath number Typ danych):

CONVERT(float(53), CONVERT(money, OrderDetail.UnitPrice)) 

Zakładając, że OrderQty atrybut nie ma XSD danych wpisz OrderQty jest konwertowananumber Wyrażenie XPath typu danych w jednym konwersji

CONVERT(float(53), OrderDetail.OrderQty)

Podobnie, wartość 98 jest konwertowany na number Wyrażenie XPath typ danych:

CONVERT(float(53), 98)

Uwaga

Jeśli typ danych XSD, używany w schemacie nie jest zgodna z podstawowych SQL Server Typ danych w bazie danych, lub jeśli to niemożliwe XPath typ danych jest wykonywana konwersję, SQL Server może zwracać błąd. Na przykład jeśli Pole IDPracownika atrybut jest odnotowany z id-prefix Adnotacja wyrażenie XPath Employee[@EmployeeID=1] generuje błąd, ponieważ Pole IDPracownika has the id-prefix adnotacji i nie można przekonwertować na number.