XQuery ve Statik Tipleme

Şunlar için geçerlidir: SQL Server

SQL Server'daki XQuery, statik tipli bir dildir. Yani, sorgu derleme sırasında bir ifade, belirli bir fonksiyon veya operatör tarafından kabul edilmeyen bir tür veya kardinaliteye sahip bir değer döndürdüğünde, tür hatalarına yol açar. Ayrıca, statik tip kontrolü, tiplenmiş bir XML belgedeki yol ifadesinin yanlış yazıldığını da tespit edebilir. XQuery derleyicisi önce atomizasyon gibi örtük işlemleri ekleyen normalizasyon aşamasını uygular, ardından statik tip çıkarımı ve statik tip kontrolü gerçekleştirir.

Statik Tip Çıkarımı

Statik tip çıkarımı, bir ifadenin dönüş tipini belirler. Bunu, giriş parametrelerinin statik tiplerini ve işlemin statik anlamını alarak sonucun statik tipini çıkararak belirler. Örneğin, 1 + 2.3 ifadesinin statik tipi şu şekilde belirlenir:

  • 1'in statik tipi xs:tamsayı , 2.3'ün statik tipi ise xs:ondalıktır. Dinamik anlamanlam temelinde, işlemin + statik anlamanlamı tam sayı ondalık olarak dönüştürür ve ardından ondalık döndürür. Çıkarılan statik tip o zaman xs:ondalık olurdu.

Tiplenmemiş XML örnekleri için, verinin yazılmadığını gösteren özel tipler vardır. Bu bilgi, statik tip kontrolü sırasında ve belirli örtük dökümler için kullanılır).

Tiplenen veri için, giriş türü, XML veri tipi örneğini kısıtlayan XML şema koleksiyonundan çıkarılır. Örneğin, şema yalnızca xs:tam sayı tipindeki elemanlara izin verirse, o elemanı kullanan bir yol ifadesinin sonucu sıfır veya daha fazla xs:tam sayı türündeki eleman olur. Bu, şu anda yıldız (*) ile ortaya çıkan türün kardinalitesini gösterdiği bir ifade element(age,xs:integer)* kullanılarak ifade edilir. Bu örnekte, ifade "yaş" isiminin sıfır veya daha fazla elemanı ve xs:tam sayı türüne yol açabilir. Diğer kardinaliteler tam olarak birdir ve sadece tip adı kullanılarak ifade edilir: sıfır veya bir, soru işareti (?) ile ifade edilir, 1 veya daha fazla ise artı işareti (+) kullanılarak ifade edilir.

Bazen, statik tip çıkarımı bir ifadenin her zaman boş diziyi geri getireceğini çıkarabilir. Örneğin, tiplenmiş bir XML veri tipinde bir yol ifadesi müşteri <> öğesi içinde bir isim öğesi ararsa (/customer/name), ancak şema müşteri>< içinde bir <isim> tanımıyorsa, statik tür çıkarımı sonucun boş olacağını çıkarır.<> Bu, yanlış sorguları tespit etmek için kullanılır ve ifadesi () veya data( () ) değilse statik bir hata olarak bildirilir.

Ayrıntılı çıkarım kuralları XQuery spesifikasyonunun biçimsel anlamında sağlanmıştır. Microsoft, bunları yalnızca tipli XML veri tipi örnekleriyle çalışacak şekilde biraz değiştirmiştir. Standarttan en önemli değişiklik, örtük belge düğümünün XML veri tipi örneğinin türünü bilmesidir. Sonuç olarak, /age formunda bir yol ifadesi bu bilgiye göre tam olarak tiplenir.

SQL Server Profiler Şablonları ve İzinleri kullanarak, sorgu derlemelerinin bir parçası olarak geri dönen statik türleri görebilirsiniz. Bunları görmek için izinizin TSQL olay kategorisine XQuery Static Type olayını dahil etmesi gerekir.

Statik Tip Kontrolü

Statik tip kontrolü, çalışma zamanı yürütmesinin yalnızca işlem için uygun tip değerleri almasını sağlar. Türlerin çalışma zamanı kontrol edilmesi gerekmediği için, derlemenin erken aşamasında potansiyel hatalar tespit edilebilir. Bu da performansı artırmaya yardımcı olur. Ancak, statik yazı yazmak, sorgu yazarının sorgu oluştururken daha dikkatli olmasını gerektirir.

Aşağıda kullanılabilecek uygun türler bulunmaktadır:

  • Bir fonksiyon veya işlem tarafından açıkça izin verilen türler.

  • Açıkça izin verilen bir türün alt tipi.

Alt tipler, XML şemasının kısıtlanması veya genişletilmesiyle türetilme için kullanılan alt tipleme kurallarına dayanarak tanımlanır. Örneğin, bir S tipi, T tipinin bir alt türüdür; eğer S tipine sahip tüm değerler aynı zamanda T tipinin örnekleri ise.

Ayrıca, tüm tamsayı değerler de ondalık değerlerdir ve XML şema tip hiyerarşisine dayanır. Ancak, tüm ondalık değerler tam sayı değildir. Bu nedenle, tam sayı ondalık bir alt türdür, ancak tam tersi değildir. Örneğin, işlem + yalnızca belirli türlerdeki değerlere izin verir; örneğin xs:integer, xs:decimal, xs:float ve xs:double. Eğer xs:string gibi diğer türlerin değerleri iledilirse, işlem tip hatası oluşturur. Buna güçlü tipleme denir. Diğer türlerin değerleri, örneğin tipsiz XML'i belirtmek için kullanılan atomik tip, operasyonun kabul ettiği bir tipin değerine örtük olarak dönüştürülebilir. Buna zayıf tipleme denir.

Örtük bir dönüşümden sonra gereklidirse, statik tür kontrolü, yalnızca doğru kardinalite sahip izin verilen türlerin değerlerinin bir operasyona aktarılmasını garanti eder. "String" + 1 için, statik "string" türünün xs:string olduğunu tanır. Bu işlem için izin verilen bir tip + olmadığı için bir tür hatası ortaya çıkar.

E1 ifadesinin sonucu keyfi bir ifade E2'ye eklenirse (E1 + E2), statik tip çıkarımı önce E1 ve E2'nin statik tiplerini belirler ve ardından işlem için izin verilen türlerle statik tiplerini kontrol eder. Örneğin, E1'in statik tipi xs:string veya xs:tam sayı olabilirse, statik tip kontrolü tür hatası oluşturur, ancak çalışma zamanındaki bazı değerler tam sayı olabilir. E1'in statik tipi xs:integer* olsaydı durum aynıdır. İşlem + sadece tam bir tam sayı değerini kabul ettiğinden ve E1 sıfır veya 1'den fazla döndürebileceği için, statik tip kontrolü hata oluşturur.

Daha önce belirtildiği gibi, tür çıkarımı genellikle kullanıcının aktarılan veri türü hakkında bildiğinden daha geniş bir tür çıkarır. Bu durumlarda, kullanıcı sorguyu yeniden yazmak zorunda kalır. Bazı tipik vakalar şunlardır:

  • Tip, süper tip veya tiplerin birleşimi gibi daha genel bir tür çıkarır. Eğer tip atomik tipse, gerçek statik tipi belirtmek için döküm ifadesi veya yapıcı fonksiyonunu kullanmalısınız. Örneğin, E1 ifadesinin çıkarılan türü xs:string veya xs:integer arasında bir seçim isese ve toplamda xs:tam sayı gerekiyorsa, xs:integer(E1) + E2E1+E2yerine yazmalısınız. Bu ifade, xs:tam sayı olarak kullanılamayan bir dizi değeriyle karşılaşılırsa çalışma zamanında başarısız olabilir. Ancak, ifade artık statik tip kontrolünü geçer. Bu ifade boş diziye eşlenir.

  • Tip, verilerin içinde bulunduğundan daha yüksek bir kardinalite çıkarır. Bu sıkça görülür, çünkü xml veri tipi birden fazla üst seviye eleman içerebilir ve bir XML şema koleksiyonu bunu kısıtlayamaz. Statik tipi azaltmak ve en fazla bir değerin geçildiğinden emin olmak için, konumsal önlem [1]kullanmalısınız. Örneğin, üst seviye bir elemanın write (/a/b/@c)[1]+1altındaki elemanın b özniteliğinin c değerine 1 eklemek için . Ayrıca, DOCUMENT anahtar kelimesi bir XML şema koleksiyonuyla birlikte kullanılabilir.

  • Bazı işlemler çıkarım sırasında tür bilgisini kaybeder. Örneğin, bir düğümün türü belirlenemiyorsa, herhangi bir Tip olur. Bu, başka hiçbir türe dolaylı olarak yansıtılmaz. Bu dönüşümler en belirgin şekilde ana eksen kullanılarak navigasyon sırasında gerçekleşir. Böyle işlemlerden kaçınmalı ve ifade statik tip hatası yaratacaksa sorguyu yeniden yazmalısınız.

Birlik Tiplerinin Tip Kontrolü

Birlik tipleri, tip kontrolü nedeniyle dikkatli bir şekilde ele alınması gerektirir. Problemlerden ikisi aşağıdaki örneklerde gösterilmiştir.

Örnek: Birlik Türü üzerinden Fonksiyon

Birlik tipi için <r> bir eleman tanımını ele alalım:

<xs:element name="r">  
<xs:simpleType>  
   <xs:union memberTypes="xs:int xs:float xs:double"/>  
</xs:simpleType>  
</xs:element>  

XQuery bağlamında, "ortalama" fonksiyon fn:avg (//r) statik bir hata döndürür, çünkü XQuery derleyicisi fn:avg() argümanındaki öğeler için farklı türde (xs:int, xs:float veya xs:double) <r> değerler ekleyemez. Bunu çözmek için, fonksiyon çağrısını şu şekilde yeniden yazın:fn:avg(for $r in //r return $r cast as xs:double ?)

Örnek: Operatör üzerinde Union Tipi

Toplama işlemi ('+') için operandların kesin tipleri gereklidir. Sonuç olarak, ifade (//r)[1] + 1 daha önce tanımlanan tür <r>tanımına sahip olan statik bir hata döndürür. Bir çözüm, bunu "?" olarak yeniden (//r)[1] cast as xs:int? +1yazmaktır; burada "?" 0 veya 1 karşılaşmayı gösterir. SQL Server, herhangi bir yayın zamanı hataları nedeniyle boş diziyi oluşturabildiği için "a" ile "a" ile "cast edilmesi" gerektirir.