Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
van toepassing op:SQL Server-
Met de W3C-specificatie kunnen typefouten statisch of dynamisch worden gegenereerd en worden statische, dynamische en typefouten gedefinieerd.
Compilatie en foutafhandeling
Compilatiefouten worden geretourneerd van syntactisch onjuiste Xquery-expressies en XML DML -instructies. Tijdens de compilatiefase wordt de juistheid van het statische type van XQuery-expressies en DML-instructies gecontroleerd en worden XML-schema's gebruikt voor typededucties voor getypte XML. Het veroorzaakt statische typefouten als een expressie tijdens de runtime kan mislukken vanwege een schending van de veiligheid van het type. Voorbeelden van statische fouten zijn het toevoegen van een tekenreeks aan een geheel getal en het opvragen van een niet-bestaand knooppunt voor getypte gegevens.
Als afwijking van de W3C-standaard worden XQuery-runtimefouten geconverteerd naar lege reeksen. Deze reeksen kunnen worden doorgegeven als lege XML of NULL het queryresultaat, afhankelijk van de aanroepcontext.
Door expliciet te casten naar het juiste type kunnen gebruikers statische fouten omzeilen, hoewel runtime-cast-fouten worden getransformeerd naar lege reeksen.
Opmerking
Parseringsfouten die zijn gegenereerd door de XQuery-parser (zoals syntaxisfouten in de XML waarnaar wordt verwezen als onderdeel van de XML-gegevenstypemethode, bijvoorbeeld), afbreken de actieve transactie, ongeacht de XACT_ABORT instelling van de huidige sessie.
Statische fouten
Statische fouten worden geretourneerd met behulp van het Transact-SQL foutmechanisme. In SQL Server worden XQuery-typefouten statisch geretourneerd. Zie XQuery- en statische typenvoor meer informatie.
Dynamische fouten
In XQuery worden de meeste dynamische fouten toegewezen aan een lege reeks (()). Dit zijn echter de twee uitzonderingen: Overloopvoorwaarden in XQuery-aggregatorfuncties en XML-DML validatiefouten. De meeste dynamische fouten worden toegewezen aan een lege reeks. Anders kan het uitvoeren van query's die profiteren van de XML-indexen onverwachte fouten veroorzaken. Daarom wijst SQL Server Database Engine dynamische fouten toe aan () om een efficiƫnte uitvoering te bieden zonder onverwachte fouten te genereren.
Vaak verandert de semantiek niet in de situatie waarin de dynamische fout binnen een predicaat zou optreden, omdat () is toegewezen aan False. In sommige gevallen kan het retourneren () in plaats van een dynamische fout onverwachte resultaten veroorzaken. Hier volgen voorbeelden die dit illustreren.
Voorbeeld: De functie avg() gebruiken met een tekenreeks
In het volgende voorbeeld wordt de functie Avg aangeroepen om het gemiddelde van de drie waarden te berekenen. Een van deze waarden is een tekenreeks. Omdat het XML-exemplaar in dit geval niet is getypt, zijn alle gegevens in het type atomisch niet-getypt. Met de functie avg() worden deze waarden eerst omgezet in xs:double voordat het gemiddelde wordt berekend. De waarde, "Hello"kan echter niet worden omgezet in xs:double en maakt een dynamische fout. In dit geval, in plaats van een dynamische fout te retourneren, veroorzaakt de cast van "Hello" naar xs:double een lege reeks. De functie avg() negeert deze waarde, berekent het gemiddelde van de andere twee waarden en retourneert 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(//*)')
Voorbeeld: De functie niet gebruiken
Wanneer u bijvoorbeeld de functie Not in een predicaat /SomeNode[not(Expression)]gebruikt en de expressie een dynamische fout veroorzaakt, wordt een lege reeks geretourneerd in plaats van een fout. Het toepassen van niet() op de lege reeks retourneert Waar, in plaats van een fout.
Voorbeeld: Een tekenreeks casten
In het volgende voorbeeld wordt de letterlijke tekenreeks 'NaN' omgezet naar xs:string en vervolgens naar xs:double. Het resultaat is een lege rijenset. Hoewel de tekenreeks 'NaN' niet kan worden gecast naar xs:double, kan dit pas worden bepaald nadat de runtime is uitgevoerd omdat de tekenreeks voor het eerst wordt gecast naar xs:string.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO
In dit voorbeeld treedt echter een statische typefout op.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO
Implementatiebeperkingen
De functie fn:error() wordt niet ondersteund.