Udostępnij przez


Obsługa błędów (XQuery)

Dotyczy:programu SQL Server

Specyfikacja W3C umożliwia statyczne lub dynamiczne wywoływanie błędów typu oraz definiowanie statycznych, dynamicznych i błędów typu.

Kompilacja i obsługa błędów

Błędy kompilacji są zwracane z niepoprawnych składniowo wyrażeń i XML DML instrukcji Xquery. Faza kompilacji sprawdza poprawność statycznego typu wyrażeń XQuery i instrukcji DML oraz używa schematów XML do wnioskowania typów dla typowych danych XML. Zgłasza on błędy typu statycznego, jeśli wyrażenie może zakończyć się niepowodzeniem w czasie wykonywania z powodu naruszenia bezpieczeństwa typu. Przykłady błędu statycznego to dodanie ciągu do liczby całkowitej i wykonywanie zapytań o nieistniejący węzeł dla wpisanych danych.

Jako odchylenie od standardu W3C błędy czasu wykonywania XQuery są konwertowane na puste sekwencje. Te sekwencje mogą być propagowane jako pusty kod XML lub NULL wynik zapytania, w zależności od kontekstu wywołania.

Jawne rzutowanie do poprawnego typu umożliwia użytkownikom obejście błędów statycznych, chociaż błędy rzutowania w czasie wykonywania zostaną przekształcone w puste sekwencje.

Uwaga / Notatka

Analizowanie błędów zgłaszanych przez analizator XQuery (na przykład błędy składni w kodzie XML, do których odwołuje się metoda typu danych XML, na przykład), przerwanie aktywnej transakcji, niezależnie od ustawienia XACT_ABORT bieżącej sesji.

Błędy statyczne

Błędy statyczne są zwracane przy użyciu mechanizmu błędów Transact-SQL. W programie SQL Server błędy typu XQuery są zwracane statycznie. Aby uzyskać więcej informacji, zobacz XQuery i Static Typing.

Błędy dynamiczne

W trybie XQuery większość błędów dynamicznych jest mapowana na pustą sekwencję ("()"). Są to jednak dwa wyjątki: warunki przepełnienia w funkcjach agregatora XQuery i błędy weryfikacji XML-DML. Większość błędów dynamicznych jest mapowana na pustą sekwencję. W przeciwnym razie wykonywanie zapytań, które ma zalety indeksów XML, może spowodować nieoczekiwane błędy. W związku z tym, aby zapewnić wydajne wykonywanie bez generowania nieoczekiwanych błędów, aparat bazy danych programu SQL Server mapuje błędy dynamiczne na ().

Często w sytuacji, gdy błąd dynamiczny występuje wewnątrz predykatu, nie zgłasza błędu nie zmienia semantyki, ponieważ () jest mapowany na wartość False. Jednak w niektórych przypadkach zwracanie () zamiast błędu dynamicznego może spowodować nieoczekiwane wyniki. Poniżej przedstawiono przykłady ilustrujące to.

Przykład: używanie funkcji avg() z ciągiem

W poniższym przykładzie funkcja Avg jest wywoływana w celu obliczenia średniej z trzech wartości. Jedną z tych wartości jest ciąg. Ponieważ wystąpienie XML w tym przypadku jest nietypowe, wszystkie dane w nim mają nietypowy typ nietypowy. Funkcja avg() najpierw rzutuje te wartości na xs:double przed obliczeniu średniej. Jednak wartość "Hello", nie można rzutować na xs:double i tworzy błąd dynamiczny. W takim przypadku zamiast zwracać błąd dynamiczny, rzutowanie "Hello" na xs:double powoduje pustą sekwencję. Funkcja avg() ignoruje tę wartość, oblicza średnią pozostałych dwóch wartości i zwraca 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(//*)')

Przykład: używanie funkcji not

Jeśli używasz funkcji Not w predykacie, na przykład /SomeNode[not(Expression)], a wyrażenie powoduje błąd dynamiczny, pusta sekwencja zostanie zwrócona zamiast błędu. Zastosowanie not() do pustej sekwencji zwraca wartość True zamiast błędu.

Przykład: rzutowanie ciągu

W poniższym przykładzie ciąg literału "NaN" jest rzutowy na ciąg xs:string, a następnie na xs:double. Wynik jest pustym zestawem wierszy. Mimo że ciąg "NaN" nie można pomyślnie rzutować do xs:double, nie można go określić do czasu wykonania, ponieważ ciąg jest najpierw rzutowy na xs:string.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO

W tym przykładzie występuje jednak błąd typu statycznego.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO

Ograniczenia implementacji

Funkcja fn:error() nie jest obsługiwana.