Aracılığıyla paylaş


XQuery ve statik yazma

XQuery içindeki SQL Server statik olarak yazılan bir dili.Bir deyim yazın veya belirli bir tarafından kabul edilen kardinalite sahip bir değerini döndürdüğünde, tür hatalarının sorgu derleme sırasında yükseltir işlev veya işleç.Ayrıca, statik tür denetimi zamanda algılamak , yazılı bir xml belgesinde bir yol ifade yanlış yazmış.XQuery derleyici ilk örtülü operasyonlar atomization gibi ekler ve sonra statik tür kesmesi ve statik tür denetimi gerçekleştiren normalleştirme aşaması için geçerlidir.

Statik tür kesmesi

Statik tür kesmesi dönüş türünü belirleyen bir ifade.Bu giriş parametreleri ve statik statik tür alarak belirler semantik ve işlem sonuç türü statik gösterilirken.Örneğin, 1 + 2.3 ifade statik türü aşağıdaki şekilde belirlenir:

  • 1 Statik türde xs:integer ve 2.3 statik türde xs:decimal.Dinamik alarak semantik, statik semantik , + işlemi, tamsayı, ondalık sayıya dönüştürür ve sonra ondalık döndürür.İnferred statik türde sonra olurdu xs:decimal.

Untyped xml örnekleri için veri yazılı olduğunu belirtmek için özel türü vardır.Bu bilgiler belirli örtülü yayınları gerçekleştirmek için de statik tür denetimi sırasında kullanılır).

Yazılan veriler için giriş türü xml şemasından olayla koleksiyon , xml veri türü örnek zorlar.Şema türü yalnızca öğeleri sağlar, örneğin, xs:integer, sıfır veya daha fazla öğe türü, öğe kullanarak bir yol ifade sonuçlar olacaktır xs:integer.Bu şu anda gibi bir ifade kullanarak ifade edilen element(age,xs:integer)* Burada, yıldız işareti (*) gösterir kardinalite düzeyini elde edilen bir tür.Bu örnekte, adı "geçerlilik süresi" sıfır veya daha fazla öğe içinde ifade neden olabilir ve yaz xs:integer.Diğer cardinalities biri olan ve tek başına, tür adı kullanarak ifade sıfır veya bir ve bir soru işareti kullanarak ifade (?) ve 1 veya daha fazla ve artı işareti kullanarak cinsinden (+).

Bazı durumlarda, statik tür kesmesi bir ifade her zaman boş sırası döndürür gerçekleştirip.Örneğin, üzerinde bir yol ifade ise yazılan bir xml veri türü arar bir <adı> öğesi içinde bir <Müşteri> öğesi (/ müşteri/adı), ancak şema izin vermez bir <ad> içinde bir <Müşteri>, statik tür kesmesi gerçekleştirip, sonucu olacaktır yok.Bu hatalı sorgu algılamak için kullanılan ve ifade olduğu sürece () statik bir hata olarak bildirilen veya data( () ).

Ayrıntılı kesmesi kuralları içinde resmi sağlanan semantik XQuery belirtimi.Microsoft, yalnızca bu biraz türü örnekleri yazılı xml verileriyle çalışmak için değiştirdi.En önemli standart örtülü belge düğümü xml veri türü örnek hakkında öğrenene olduğunu farklıdır.Sonuç olarak, bir yol ifade formu /age, tam olarak bu bilgilere dayanarak yazılması.

Kullanarak sql Server Profiler'I kullanma, döndürülen bir parçası olarak statik türler bakınsorgu derlemeler. Bunları görmek için kendi izleme tsql olay kategorisi XQuery statik tür olay eklemeniz gerekir.

Statik tür denetlemesi

Statik tür denetimi sağlar, çalışma -saat yürütme işlemi için uygun türü olan değerler yalnızca alırsınız.Türleri çalışma zamanında teslim olmadığı için saat, olası hatalar algılanan derleme erken.Bu, performansın iyileşmesine yardımcı olur.Ancak, statik yazarak sorgu yazan bir sorgu formulating de daha dikkatli olması gerekir.

Kullanılabilir uygun türleri şunlardır:

  • Bir işlev veya işlem tarafından açıkça izin türleri.

  • Bir alt türü kesin olarak izin verilen bir tür.

Alt türlerinden türetme kullanarak subtyping kurallarını sınırlama veya xml şema uzantısı tarafından esas olarak tanımlanır.Örneğin, s türü alt türü olan bir yazın t, s türü olan tüm değerleri de oluşumunu t.

Ayrıca, tüm tamsayı değerler xml şema türü hiyerarşik ondalık değerler de kullanılabilir.Ancak, tüm ondalık tamsayı değerlerdir.Bu nedenle, bir alt türü tamsayı, ondalık, ancak bunun tersi mümkün değildir.Örneğin, + işlemi yalnızca sayısal türler gibi belirli türdeki değerleri verir xs:integer, xs:decimal, xs:float, ve xs:double.Diğer değerler yazarsa, gibi xs:dize, olan geçirilen, işlem türü hata yükseltir.Bu güçlü yazarak olarak adlandırılır.Untyped xml göstermek için kullanılan Atomik türü gibi diğer türlerdeki değerleri işlem kabul eden bir türü için bir değer örtük olarak dönüştürülebilir.Bu zayıf yazarak olarak adlandırılır.

Bir kapalı dönüştürme sonra gerekirse, statik tür denetimi yalnızca doğru kardinalite izin verilen türleriyle değerlerini bir işleme iletilir garanti eder."Dize" için + 1, tanıdığı, "dize" statik türü İş xs:dize.Bunun için izin verilen bir türü olduğu için + operasyon, tür hatası neden oldu.

Rasgele bir sonucu ekleme durumunda, ifade için rasgele bir E1 ifade E2 (E1 + E2), statik tür kesmesi ilk E1 ve E2 statik türlerini belirler ve daha sonra operasyon için izin verilen türler ile statik bunların türlerini denetler.E1 statik türü şunlardan biri olabilir, örneğin, bir xs:dize veya bir xs:integer, bazı değerleri de çalışma zamanında statik türde onay bir tür hata harekete geçiren saat tamsayı olabilir.Aynı olması durum E1 statik türü olsaydı xs:integer*.Çünkü + işlemi yalnızca tam olarak bir tamsayı değeri kabul eder ve E1 sıfır geri dönmek veya birden fazla 1, statik türde denetim bir hata yükseltir.

Daha önce belirtildiði gibi tür kesmesi sık ne kullanıcı Geçirilmekte olan veri hakkında öğrenene çok daha geniş bir türü yorumlar.Bu durumda, kullanıcının sorguyu yeniden yazmak vardır.Bazı tipik durumlar şunlardır:

  • Bu tür bir supertype veya bir birleşim türleri gibi daha genel bir tür yorumlar.Türü bir Atomik türü ise, atama ifadesi veya Oluşturucusu kullanmanız gereken işlev gerçek statik türü belirtmek için.Örneğin, inferred türü ifade E1 arasında bir seçim olduğu xs:dize veya xs:integer eklenmesini gerektirir ve xs:integer, yazması gerektiğini xs:integer(E1) + E2 yerine E1+E2.Bu ifadeyi Başlangıçta Çalıştır başarısız olabilir saat bir dize değeri girilirse, edilemiyor artığını için xs:integer.Ancak, ifade şimdi statik tür denetiminden geçer.İle başlayan SQL Server 2005, bu ifade eşlenmiş boş sırası.

  • Ne gerçekten verileri içeren daha yüksek bir kardinalite türü yorumlar.Sık sık, çünkü böyle xml birden fazla üst düzey öğesi ve bir xml şeması veri türü içerebilir koleksiyon bu oranları olamaz.Statik türde azaltmak ve garanti olduğunu aslında en çok geçirilen bir değer için konumsal yüklemi kullanmanız gerekir [1].Örneğin, 1 değerine eklemek için öznitelik c öğesinin b altında en üst düzey bir öğesi gerekir write (/a/b/@c)[1]+1.Ayrıca, BELGENİN anahtar sözcüğü ile birlikte bir xml şeması kullanılabilir koleksiyon.

  • Bazı işlemleri sırasında kesmesi türü bilgileri kaybedersiniz.Örneğin, bir düğüm türü belirlenemiyorsa dönüşür anyType.Bu dolaylı olarak başka türlü tonunu değil.Üst kullanarak gezinti sırasında özellikle bu dönüşümleri ortaya eksen.Bu tür işlemleri kullanmaktan kaçının ve ifade statik tür hatası oluşturacak, sorgu yeniden yazma.

Birleşim türleri denetimi türü

Birleşim türü, tür denetimi nedeniyle dikkatli işleme gerektirir.İki sorunları aşağıdaki örneklerde gösterilmiştir.

Örnek: İşlev birleşim türü üzerinden

Bir öğe tanımı için göz önünde <r> bir birleşim türü:

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

XQuery bağlamında, "ortalama" işlev fn:avg (//r) farklı türlerdeki değerleri XQuery derleyici ekleyemezsiniz çünkü bir statik hata verir (xs:int, xs:float veya xs:double) için <r> öğeleri, bağımsız değişken olarak fn:avg().Bunu çözmek için işlev çağrısı olarak yeniden fn:avg(for $r in //r return $r cast as xs:double ?).

Örnek: İşleç birleşim türü üzerinden

Toplama işlemi ('+') kesin işlenen türleri gerektirir.Sonucunda, ifade (//r)[1] + 1 önceden açıklanan tür tanımında öğe için olan statik hata verir <r>.Bir çözüm olduğu gibi yeniden yazmak zorunda (//r)[1] cast as xs:int? +1, nerede "?" 0 veya 1 tekrarı gösterir.İle başlayan SQL Server 2005, SQL Server "olarak artığını" gerektirir ile "?", herhangi bir saçılması sonucu olarak çalıştır - boş sırası neden olabileceğindensaat hataları.

Ayrıca bkz.

Diğer Kaynaklar