Getypte XML vergelijken met niet-getypte XML
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
U kunt variabelen, parameters en kolommen van het xml- type maken. U kunt desgewenst een verzameling XML-schema's koppelen aan een variabele, parameter of kolom van xml- type. In dit geval wordt het xml- exemplaar van het gegevenstype met typegenoemd. Anders wordt het XML-exemplaar niet-getyptegenoemd.
Goed opgemaakte XML en het XML-gegevenstype
Het xml- gegevenstype implementeert het ISO-standaardgegevenstype xml-. Daarom kan het goed opgemaakte XML-versie 1.0-documenten en ook zogenaamde XML-inhoudsfragmenten opslaan met tekstknooppunten en een willekeurig aantal elementen op het hoogste niveau in een niet-getypte XML-kolom. Het systeem controleert of de gegevens goed zijn opgemaakt, vereist niet dat de kolom is gebonden aan XML-schema's en weigert gegevens die niet goed zijn opgemaakt in de uitgebreide zin. Dit geldt ook voor niet-getypte XML-variabelen en -parameters.
XML-schema's
Een XML-schema biedt het volgende:
Validatiebeperkingen. Wanneer een getypt XML-exemplaar wordt toegewezen aan of gewijzigd, valideert SQL Server het exemplaar.
Gegevenstypegegevens. Schema's bevatten informatie over de typen kenmerken en elementen in het xml- gegevenstype-exemplaar. De typegegevens bieden nauwkeurigere operationele semantiek voor de waarden in het exemplaar dan mogelijk is met niet-getypte xml-. Rekenkundige bewerkingen voor decimalen kunnen bijvoorbeeld worden uitgevoerd op een decimale waarde, maar niet op een tekenreekswaarde. Hierdoor kan getypte XML-opslag aanzienlijk compacter worden gemaakt dan niet-getypte XML.
Getypte of niet-getypte XML kiezen
Gebruik niet-getypte xml- gegevenstype in de volgende situaties:
U hebt geen schema voor uw XML-gegevens.
U hebt schema's, maar u wilt niet dat de server de gegevens valideert. Dit is soms het geval wanneer een toepassing validatie aan de clientzijde uitvoert voordat de gegevens op de server worden opgeslagen, of xml-gegevens tijdelijk opslaat die ongeldig zijn volgens het schema, of schemaonderdelen gebruikt die niet worden ondersteund op de server.
Gebruik getypte xml- gegevenstype in de volgende situaties:
U hebt schema's voor uw XML-gegevens en u wilt dat de server uw XML-gegevens valideert op basis van de XML-schema's.
U wilt profiteren van opslag- en queryoptimalisaties op basis van typegegevens.
U wilt beter profiteren van typegegevens tijdens het compileren van uw query's.
Getypte XML-kolommen, -parameters en -variabelen kunnen XML-documenten of -inhoud opslaan. U moet echter opgeven met een vlag of u een document of inhoud opslaat op het moment van declaratie. Daarnaast moet u de verzameling XML-schema's opgeven. Geef DOCUMENT op als elk XML-exemplaar precies één element op het hoogste niveau heeft. Gebruik anders CONTENT. De querycompilator gebruikt de vlag DOCUMENT in typecontroles tijdens het compileren van query's om singleton-elementen op het hoogste niveau af te leiden.
Getypte XML maken
Voordat u xml- variabelen, parameters of kolommen kunt maken, moet u eerst de XML-schemaverzameling registreren met behulp van CREATE XML SCHEMA COLLECTION (Transact-SQL). Vervolgens kunt u de XML-schemaverzameling koppelen aan variabelen, parameters of kolommen van het xml- gegevenstype.
In de volgende voorbeelden wordt een naamconventie van twee delen gebruikt voor het opgeven van de naam van de XML-schemaverzameling. Het eerste deel is de schemanaam en het tweede deel is de naam van de XML-schemaverzameling.
Voorbeeld: Een schemaverzameling koppelen aan een XML-typevariabele
In het volgende voorbeeld wordt een xml- typevariabele gemaakt en wordt er een schemaverzameling aan gekoppeld. De schemaverzameling die in het voorbeeld is opgegeven, wordt al geïmporteerd in de AdventureWorks-database.
DECLARE @x xml (Production.ProductDescriptionSchemaCollection);
Voorbeeld: Een schema opgeven voor een xml-typekolom
In het volgende voorbeeld wordt een tabel gemaakt met een xml- typekolom en wordt een schema voor de kolom opgegeven:
CREATE TABLE T1(
Col1 int,
Col2 xml (Production.ProductDescriptionSchemaCollection));
Voorbeeld: een parameter van het XML-type doorgeven aan een opgeslagen procedure
In het volgende voorbeeld wordt een xml- typeparameter doorgegeven aan een opgeslagen procedure en wordt een schema voor de variabele opgegeven:
CREATE PROCEDURE SampleProc
@ProdDescription xml (Production.ProductDescriptionSchemaCollection)
AS
...
Let op het volgende over de XML-schemaverzameling:
Een XML-schemaverzameling is alleen beschikbaar in de database waarin deze is geregistreerd met behulp van Een XML-schemaverzameling maken.
Als u van een tekenreeks naar een getypte xml- gegevenstype cast, voert de parsering ook validatie en typering uit op basis van de xml-schemanaamruimten in de opgegeven verzameling.
U kunt casten van een getypt xml- gegevenstype naar een niet-getypt xml- gegevenstype en omgekeerd.
Voor meer informatie over andere manieren om XML-gegevens te genereren in SQL Server, zie Exemplaren van XML-gegevens maken. Nadat XML is gegenereerd, kan deze worden toegewezen aan een xml- gegevenstypevariabele of worden opgeslagen in xml--typekolommen voor aanvullende verwerking.
In de gegevenstypehiërarchie wordt het xml- gegevenstype weergegeven onder sql_variant en door de gebruiker gedefinieerde typen, maar boven een van de ingebouwde typen.
Voorbeeld: facetten specificeren om een getypte XML-kolom te begrenzen
Voor getypte xml- kolommen kunt u de kolom beperken tot slechts enkele elementen op het hoogste niveau voor elk exemplaar dat erin is opgeslagen. U doet dit door het optionele DOCUMENT
facet op te geven wanneer een tabel wordt gemaakt, zoals wordt weergegeven in het volgende voorbeeld:
CREATE TABLE T(Col1 xml
(DOCUMENT Production.ProductDescriptionSchemaCollection));
GO
DROP TABLE T;
GO
Exemplaren die zijn opgeslagen in de getypte xml- kolom worden standaard opgeslagen als XML-inhoud en niet als XML-documenten. Dit maakt het volgende mogelijk:
Nul of veel elementen op het hoogste niveau
Tekstknooppunten in elementen op het hoogste niveau
U kunt dit gedrag ook expliciet opgeven door CONTENT
facet toe te voegen, zoals wordt weergegeven in het volgende voorbeeld:
CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection));
GO -- Default
U kunt de optionele facetten DOCUMENT/INHOUD opgeven, overal waar u het xml-type definieert (getypte XML). Wanneer u bijvoorbeeld een getypte xml- variabele maakt, kunt u het facet DOCUMENT/INHOUD toevoegen, zoals wordt weergegeven in het volgende:
declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);
Documenttypedefinitie (DTD)
De xml- gegevens-typekolommen, variabelen en parameters kunnen worden getypt met behulp van een XML-schema, maar niet met behulp van een DTD. Inline DTD kan echter worden gebruikt voor zowel niet-getypte als getypte XML om standaardwaarden op te geven en entiteitsverwijzingen te vervangen door hun uitgevouwen formulier.
U kunt DTD's converteren naar XML-schemadocumenten met behulp van hulpprogramma's van derden en de XML-schema's in de database laden.
Getypte XML upgraden van SQL Server 2005
SQL Server 2008 (10.0.x) heeft verschillende extensies gemaakt voor de xml-schemaondersteuning, waaronder ondersteuning voor laxvalidatie, verbeterde verwerking van xs:date, xs:time en xs:dateTime exemplaargegevens, en ondersteuning toegevoegd voor lijst- en samenvoegtypen. In de meeste gevallen hebben de wijzigingen geen invloed op de upgrade-ervaring. Als u echter een XML-schemaverzameling hebt gebruikt in SQL Server 2005 (9.x) waarvoor waarden van het type xs:date, xs:timeof xs:dateTime (of een subtype) zijn toegestaan, worden de volgende upgradestappen uitgevoerd wanneer u uw SQL Server 2005-database (9.x) koppelt aan een latere versie van SQL Server:
Voor elke XML-kolom die is getypt met een XML-schemaverzameling die elementen of attributen bevat die zijn getypt als xs:anyType, xs:anySimpleType, xs:date of een van de subtypen, xs:time of een van de subtypen, of xs:dateTime of een van de subtypen, of unie- of lijsttypen zijn die een van deze typen bevatten:
Alle XML-indexen in de kolom worden uitgeschakeld.
Alle SQL Server 2005-waarden (9.x) blijven in de Z-tijdzone worden weergegeven, omdat ze zijn genormaliseerd naar de Z-tijdzone.
Elke xs:date of xs:dateTime waarden die kleiner zijn dan 1 januari 1, leidt tot een runtimefout wanneer de index opnieuw wordt opgebouwd of een XQuery- of XML-DML-instructies worden uitgevoerd op basis van het xml- gegevenstype met die waarde.
Negatieve jaren in xs:date of xs:dateTime facetten of standaardwaarden in een XML-schemaverzameling worden automatisch bijgewerkt naar de kleinste waarde die is toegestaan door het basistype xs:date of xs:dateTime type (bijvoorbeeld 0001-01-01T00:00:00.000000Z voor xs:dateTime).
U kunt nog steeds een Transact-SQL SELECT-instructie gebruiken om het hele xml- gegevenstype op te halen, zelfs als het negatieve jaren bevat. Het is raadzaam negatieve jaren te vervangen door een jaar binnen het zojuist ondersteunde bereik of het type van het element of kenmerk te wijzigen in xs:string.