Hata işleme (XQuery)
W3C belirtimi statik veya dinamik olarak harekete geçirilen tür hataların bildirilebilmesini ve statik, dinamik tanımlar ve hataları yazın.
Derleme ve hata işleme
Xquery sözdizimi kurallarına göre yanlış ifadeler ve xml dml deyimlerini derleme hatası döndürülür.Derleme aşaması XQuery ifadeler ve dml deyimlerini statik türde doğruluğunu denetler ve xml şemaları için yazılı xml türü inferences için kullanır.Çalışma zamanında bir deyim başarısız olabilir, statik türde hataları harekete geçiren saat bir tür güvenlik ihlali nedeniyle.Statik hata ve buna ek olarak bir tamsayı ve yazılan veriler için varolmayan bir düğüme sorgulama için bir dize verilebilir.
Olarak bir sapma W3C standart, XQuery run -saat hataları boş sıralar dönüştürülür.Bu sıraları boş olarak xml veya null çağırma bağlam bağlı olarak sorgu sonucu için yaymak.
Doğru tür açık çevrim verir statik hatalara geçici çözüm, kullanıcıların Çalıştır rağmen-saat için boş sıraları cast hataları dönüştürülmüş.
Statik hataları
Statik hatalarını kullanılarak döndürülür Transact-SQL hata mekanizması.De SQL Server, XQuery türü hatalarını statik olarak dönen.Daha fazla bilgi için bkz: XQuery ve statik yazma.
Dinamik hataları
XQuery en dinamik hataları boş sırası ("()") için eşleştirilir.Ancak, iki özel durumlar şunlardır: XQuery Toplayıcı işlevleri ve xml dml doğrulama hataları koşullarında taşma.Not en dinamik hataları için boş bir sıra eşleştirilir.Aksi durumda, xml dizinler yararları götüren sorgu yürütme beklenmeyen hatalara neden olabilir.Bu nedenle, beklenmeyen hatalar oluşmadan verimli yürütmesini sağlamak için SQL Server Veritabanı Altyapısı dinamik hataları eşler için.
Sık sık burada dinamik hata oluşacaktır içinde bir yüklemi durumda hata yükseltme değil değiştirmeden semantik, () False olarak eşleştirildiği için.Bazı durumlarda, () yerine dinamik hata döndüren ancak neden olabilir beklenmeyen sonuçlar.Bunu gösteren örnekler şunlardır:
Örnek: Bir dize ile avg() işlevi kullanma
Aşağıdaki örnekte, avg işlev üç değerlerin ortalamasını hesaplamak için çağrılır.Bu değerlerden biri olan bir dize.xml örnek olduğundan bu konuda durum olan türlenmemiş, tüm veri untyped Atomik türü içeriyor.The avg() function first casts these values to xs:double before computing the average.Ancak, değer "Hello", edilemiyor artığını için xs:double ve dinamik bir hata.Bu durum, çevrim, dinamik bir hata dönmeden yerine "Hello" için xs:double neden olan boş bir sıra.The avg() function ignores this value, computes the average of the other two values, and returns 150.
DECLARE @x xml
SET @x=N'<root xmlns:myNS="test">
<a>100</a>
<b>200</b>
<c>Hello</c>
</root>'
SELECT @x.query('avg(//*)')
Örnek: Değil kullanma işlevi
Kullandığınızda, değil işlev bir yüklemi, /SomeNode[not(Expression)], ifade bir dinamik hatasına neden oluyor, boş bir sıra bir hata. yerine döndürülür veUygulama not() için boş sırası döndürür true ise, yerine bir hata.
Örnek: Bir dize vuran
Aşağıdaki örnekte, hazır dize "NaN" xs:dize, sonra xs:double artığını.Boş bir satır kümesi sonucudur.Ancak dize "NaN" başarıyla atanamaz dizenin ilk xs:dize için artığını çünkü xs:double için bu kadar çalışma zamanı belirlenemez.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO
Bu örnekte, ancak statik türde hata oluşur.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO
Uygulama kısıtlamaları
The fn:error() function is not supported.