Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Microsoft SQL Server, XPath ve XML Schema (XSD) çok farklı veri türlerine sahiptir. Örneğin, XPath'ın tamsayı veya tarih veri tipleri yoktur, ancak SQL Server ve XSD'de çok sayıda veri vardır. XSD zaman değerleri için nanosaniye hassasiyeti kullanırken, SQL Server en fazla 1/300 saniyelik hassasiyet kullanır. Sonuç olarak, bir veri tipini diğerine eşlemek her zaman mümkün değildir. SQL Server veri tiplerinin XSD veri tiplerine eşlenmesi hakkında daha fazla bilgi için Data Type Coercions ve sql:datatype Annotation (SQLXML 4.0) sayfasına bakınız.
XPath'ın üç veri tipi vardır: dize, sayı ve boolean. Sayı veri tipi her zaman IEEE 754 çift hassasiyetli kayan nokta tipidir. SQLServer float(53) veri tipi, XPath sayısına en yakın olanıdır. Ancak, float(53) tam olarak IEEE 754 değildir. Örneğin, ne NaN (Not-a-Number) ne de sonsuzluk kullanılmaz. Sayısal olmayan bir diziyi sayıya dönüştürmeye ve sıfıra bölmeye çalışmak hata ile sonuçlanır.
XPath Dönüşümleri
Bir XPath sorgusu kullandığınızda, OrderDetail[@UnitPrice > "10.0"]örneğin , örtük ve açık veri tipi dönüşümleri sorgu anlamını ince şekillerde değiştirebilir. Bu nedenle, XPath veri türlerinin nasıl uygulandığını anlamak önemlidir. XPath dil spesifikasyonu, XML Yol Dili (XPath) sürüm 1.0 W3C Önerilen Öneri 8 Ekim 1999, W3C web sitesinde bulunabilir.http://www.w3.org/TR/1999/PR-xpath-19991008.html
XPath operatörleri dört kategoriye ayrılır:
Boolean operatörler (ve, veya
İlişkisel operatörler (<, >, <=, >=)
Eşitlik operatörleri (=, !=)
Aritmetik operatörler (+, -, *, div, mod)
Her operatör kategorisi operandlarını farklı şekilde dönüştürür. XPath operatörleri gerekirse operandlarını örtük olarak dönüştürür. Aritmetik operatörler operandlarını sayıya dönüştürür ve bir sayı değeri elde eder. Boolean operatörleri operandlarını boolean'a dönüştürür ve bir Boolean değeri elde eder. İlişkisel operatörler ve eşitlik operatörleri Boolean değeri verir. Ancak, bu tabloda gösterildiği gibi, operandlarının orijinal veri tiplerine bağlı olarak farklı dönüşüm kuralları vardır.
| Işlenen | İlişkisel işleç | Eşitlik operatörü |
|---|---|---|
| Her iki operand da düğüm kümesidir. | DOĞRUDUR ancak ve ancak bir kümede bir düğüm ve ikinci kümede bir düğüm varsa öyle ki dize değerlerinin karşılaştırılması DOĞRU olur. | Aynı. |
| Biri bir düğüm kümesi, diğeri bir dizidir. | TRUE, ancak düğüm kümesinde bir düğüm varsa ve sayıya dönüştürüldüğünde, onu sayıyadönüştürülen diziyle karşılaştırması DOĞRU olur. | DOĞRU, ancak düğüm kümesinde öyle bir düğüm varsa ki, diziye dönüştürüldüğünde onu diziyle karşılaştırması DOĞRU olur. |
| Biri bir düğüm kümesi, diğeri bir sayı. | TRUE, ancak düğüm kümesinde bir düğüm varsa ve sayıya dönüştürüldüğünde onu sayıyla karşılaştırması DOĞRU olur. | Aynı. |
| Biri bir düğüm kümesi, diğeri ise bir boolean. | DOĞRU, ancak ve ancak düğüm kümesinde öyle bir düğüm varsa ki, boolean'a ve sonra sayıya dönüştürüldüğünde, boolean ile karşılaştırılması TRUE'dur . | DOĞRU, düğüm kümesinde boolean'a dönüştürüldüğünde onu boolean ile karşılaştırmanın DOĞRU olduğu bir düğüm varsa. |
| Hiçbiri de bir düğüm seti değildir. | Her iki operandı sayıya dönüştürün ve sonra karşılaştırın. | Her iki operandı ortak bir tipe dönüştürün ve sonra karşılaştırın. Biri boolean'a dönüştürülür (bunlardan biri boolean'sa), sayı ise sayı (her biri sayıysa); aksi takdirde, diziye dönüştürün. |
Uyarı
XPath ilişkisel operatörleri her zaman operandlarını sayıya dönüştürdüklerinden, dizi karşılaştırmaları mümkün değildir. Tarih karşılaştırmalarını dahil etmek için, SQL Server 2000 XPath spesifikasyonuna şu varyasyonu sunar: İlişkisel bir operatör bir diziyi bir dizeye, bir düğüm kümesini bir diziye veya dize değerli düğüm kümesini dize değerli düğüm kümesine karşılaştırdığında, bir dizi karşılaştırması ( sayı karşılaştırması değil) yapılır.
Node-Set Dönüşümler
Düğüm kümesi dönüşümleri her zaman sezgisel değildir. Bir düğüm kümesi, kümedeki yalnızca ilk düğümün dize değeri alınarak bir diziye dönüştürülür. Bir düğüm kümesi, diziye dönüştürülerek ve ardından diziyisayıya dönüştürerek sayıya dönüştürülür. Bir düğüm kümesi, varlığının test edilmesiyle boolean'a dönüştürülür.
Uyarı
SQL Server, düğüm kümelerinde konumsal seçim yapmaz: örneğin, XPath sorgusu Customer[3] üçüncü müşteri anlamına gelir; bu tür pozisyon seçimi SQL Server'da desteklenmez. Bu nedenle, XPath spesifikasyonunda tanımlanan düğüm-set-sare veya düğüm-set-sayı dönüşümleri uygulanmaz. SQL Server, XPath spesifikasyonunda "ilk" semantik belirtildiği her yerde "herhangi bir" anlam kullanır. Örneğin, W3C XPath spesifikasyonuna dayanarak, XPath sorgusu Order[OrderDetail/@UnitPrice > 10.0] ilk OrderDetay'ın 10.0'dan büyük UnitPrice olan siparişleri seçer. SQL Server'da, bu XPath sorgu, UnitPrice değeri 10.0'dan büyük olan herhangi bir OrderDetail olan siparişleri seçer.
Boolean'a dönüşüm varoluş testi oluşturur; bu nedenle, XPath sorgusu Products[@Discontinued=true()] SQL ifadesi "Products.Stopped is not null" ile eşdeğerdir, SQL ifadesi "Products.Discontinued = 1" değil. Sorguyu son SQL ifadesine eşdeğer yapmak için önce düğüm kümesini boolean olmayan bir tipe, örneğin sayı gibi bir türe dönüştürün. Örneğin, Products[number(@Discontinued) = true()].
Çoğu operatör, düğüm kümesindeki herhangi bir veya biri için DOĞRU olduğunda DOĞRU olarak tanımlandığından, düğüm kümesi boşsa bu işlemler her zaman YANLIŞ olarak değerlendirilir. Dolayısıyla, A boşsa, hem A = B de A != B YANLIŞTIR ve not(A=B) ve not(A!=B) DOĞRUDUR.
Genellikle, bir sütuna eşlenen bir öznitelik veya eleman veritabanındaki o sütunun değeri null değilse vardır. Satırlara eşlenen öğeler, çocuklarından herhangi biri varsa vardır.
Uyarı
is-constant ile notlanmış elemanlar her zaman vardır. Sonuç olarak, XPath yüklemleri is-sabit elemanlar üzerinde kullanılamaz.
Bir düğüm kümesi diziye veya sayıya dönüştürüldüğünde, onun XDR tipi (varsa) annotasyonlu şemada incelenir ve bu tür gerekli dönüşümü belirlemek için kullanılır.
XDR Veri Tiplerini XPath Veri Tiplerine Eşleme
Bir düğümün XPath veri türü, şemadaki XDR veri tipinden türetilmiştir; aşağıdaki tabloda gösterilmiştir ( EmployeeID düğümü örnekleme amacıyla kullanılır).
| XDR veri tipi | Eşdeğer XPath veri tipi |
SQL Server dönüşümü kullanıldı |
|---|---|---|
| Nonebin.base64bin.hex | Mevcut Değil | NoneEmployeeID |
| Boolean | Boolean | CONVERT(bit, EmployeeID) |
| sayı, int, float,i1, i2, i4, i8,r4, r8ui1, ui2, ui4, ui8 | Numara | CONVERT(float(53), EmployeeID) |
| id, idref, idrefsentity, entities, enumerationnotation, nmtoken, nmtokens, chardate, Timedate, Time.tz, string, uri, uuid | String | DÖNÜŞTÜRÜCÜ(nvarchar(4000), EmployeeID, 126) |
| fixed14.4 | N/A(XPath'ta fixed14.4 XDR veri tipine eşdeğer bir veri tipi yoktur) | DÖNÜŞTÜR (para, Employee ID) |
| date | String | SOL(DÖNÜŞTÜRÜCÜ(nvarchar(4000), EmployeeID, 126), 10) |
| time time.tz |
String | SUBSTRING(CONVERT(nvarchar(4000), EmployeeID, 126), 1 + CHARINDEX(N'T', CONVERT(nvarchar(4000), EmployeeID, 126)), 24) |
Tarih ve zaman dönüşümleri, değer veritabanında SQL Servertarih-zaman veri tipi veya bir diziyle saklansa da çalışacak şekilde tasarlanmıştır. SQL Servertarih saati veri tipinin zaman dimi kullanmadığını ve XML zaman veri tipine göre daha küçük bir hassasiyete sahip olduğunu unutmayın. Zaman dilimi veri tipini veya ek hassasiyeti eklemek için, verileri SQL Server'da bir string tipiyle depolayabilirsiniz.
Bir düğüm XDR veri tipinden XPath veri tipine dönüştürüldüğünde, bazen ek dönüşüm gereklidir (bir XPath veri tipinden diğerine bir XPath veri türüne). Örneğin, şu XPath sorgusunu ele alalım:
(@m + 3) = 4
Eğer @mfixed14.4 XDR veri tipindeyse, XDR veri tipinden XPath veri tipine dönüştürme şu şekilde gerçekleştirilir:
CONVERT(money, m)
Bu dönüşümde, düğüm msabit 14.4'tenparaya dönüştürülür. Ancak, 3 değerini eklemek ek dönüşüm gerektirir:
CONVERT(float(CONVERT(money, m))
XPath ifadesi şu şekilde değerlendirilir:
CONVERT(float(CONVERT(money, m)) + CONVERT(float(53), 3) = CONVERT(float(53), 3)
Aşağıdaki tabloda gösterildiği gibi, bu dönüşüm diğer XPath ifadeleri (örneğin literaller veya bileşik ifadeler) için uygulanan aynı dönüşümdür.
| X bilinmiyor | X bir dizidir | X sayıdır | X boolean'dır | |
|---|---|---|---|---|
| String(X) | DÖNÜŞTÜR (nvarchar(4000), X, 126) | - | DÖNÜŞTÜR (nvarchar(4000), X, 126) | DURUM X O ZAMAN N'doğru' AKSI N'YANLIŞ' SON |
| numara(X) | DÖNÜŞTÜR (float(53), X) | DÖNÜŞTÜR (float(53), X) | - | DURUM X OLDUĞUNDA 1 BAŞKA 0 SON |
| boolean(X) | - | LEN(X) > 0 | X != 0 | - |
Örnekler
A. XPath sorgusunda bir veri tipini dönüştürün
Aşağıdaki XPath sorgusunda, annotasyonlu bir XSD şemasına karşı belirtilen sorgu, sorgu E-1 EmployeeID özellik değerine sahip tüm Çalışan düğümlerini seçer; burada "E-" sql:id-prefix annotasyonu kullanılarak belirtilen preektir.
Employee[@EmployeeID="E-1"]
Sorgudaki önlem SQL ifadesine eşdeğerdir:
N'E-' + CONVERT(nvarchar(4000), Employees.EmployeeID, 126) = N'E-1'
EmployeeID, XSD şemasında id (idref, idrefs, nmtoken, nmtoken vb.) veri tipi değerlerinden biri olduğundan, EmployeeID daha önce açıklanan dönüştürme kuralları kullanılarak XPath veri tipine dönüştürülür.
CONVERT(nvarchar(4000), Employees.EmployeeID, 126)
"E-" öneki diziye eklenir ve sonuç ile N'E-1'karşılaştırılır.
B. Bir XPath sorgusunda birden fazla veri türü dönüşümü gerçekleştirin
Açıklamalı bir XSD şeması karşısında belirtilen bu XPath sorgusunu ele alalım: OrderDetail[@UnitPrice * @OrderQty > 98]
Bu XPath sorgusu, önlemi @UnitPrice * @OrderQty > 98sağlayan tüm <OrderDetail> öğelerini döndürür.
Eğer UnitPrice, annotasyonlu şemada sabit bir veri tipiyle annotlanmışsa, bu önlem SQL ifadesine eşdeğerdir:
CONVERT(float(53), CONVERT(money, OrderDetail.UnitPrice)) * CONVERT(float(53), OrderDetail.OrderQty) > CONVERT(float(53), 98)
XPath sorgusundaki değerler dönüştürülürken, ilk dönüşüm XDR veri tipini XPath veri tipine dönüştürür. UnitPrice'ın XSD veri türü, önceki tabloda açıklandığı gibi sabit 14.4 olduğundan, kullanılan ilk dönüşüm budur:
CONVERT(money, OrderDetail.UnitPrice))
Aritmetik operatörler operandlarını XPath sayı veri tipine dönüştürdüklerinde, ikinci dönüşüm (bir XPath veri tipinden başka bir XPath veri türüne) uygulanır ve değer float(53) 'e dönüştürülür (float(53) XPath sayı veri tipine yakındır):
CONVERT(float(53), CONVERT(money, OrderDetail.UnitPrice))
OrderQty özniteliğinin XSD veri tipi olmadığı varsayıldığı takdirde, OrderQty tek bir dönüşümde XPath sayı veri tipine dönüştürülür:
CONVERT(float(53), OrderDetail.OrderQty)
Benzer şekilde, 98 değeri XPath veri tipine dönüştürülür :
CONVERT(float(53), 98)
Uyarı
Şemada kullanılan XSD veri tipi, veritabanındaki temel SQL Server veri tipiyle uyumsuzsa veya imkansız bir XPath veri tipi dönüşümü yapılırsa, SQL Server hata döndürebilir. Örneğin, EmployeeID özniteliği id ön eki açıklamasıyla annot edilirse, XPath Employee[@EmployeeID=1] hata oluşturur, çünkü EmployeeIDid ön eki açıklamasına sahiptir ve sayıya dönüştürülemez.