Delen via


Variabelen en kolommen voor XML-gegevenstypen maken

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Het xml- gegevenstype is een ingebouwd gegevenstype in SQL Server en is enigszins vergelijkbaar met andere ingebouwde typen, zoals int en varchar-. Net als bij andere ingebouwde typen kunt u het xml- gegevenstype als kolomtype gebruiken wanneer u een tabel maakt, als variabeltype, parametertype, functieteruggeeftype, of in CAST en CONVERT.

Kolommen en variabelen maken

Als u een xml kolom als onderdeel van een tabel wilt maken, gebruikt u een CREATE TABLE-instructie, zoals wordt weergegeven in het volgende voorbeeld:

CREATE TABLE T1(Col1 int primary key, Col2 xml);

U kunt een DECLARE statement gebruiken om een variabele van xml type te maken, zoals in het volgende voorbeeld wordt weergegeven.

DECLARE @x xml;

Maak een getypte xml variabele door een XML-schemaverzameling op te geven, zoals wordt weergegeven in het volgende voorbeeld.

DECLARE @x xml (Sales.StoreSurveySchemaCollection)

Als u een xml typeparameter wilt doorgeven aan een opgeslagen procedure, gebruikt u een CREATE PROCEDURE-instructie, zoals wordt weergegeven in het volgende voorbeeld.

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ...

U kunt XQuery gebruiken om query's uit te voeren op XML-exemplaren die zijn opgeslagen in kolommen, parameters of variabelen. U kunt ook XML Data Manipulation Language (XML DML) gebruiken om updates toe te passen op de XML-exemplaren. Omdat de XQuery-standaard XQuery DML tijdens de ontwikkeling niet heeft gedefinieerd, introduceert SQL Server XML Data Modification Language extensies voor XQuery. Met deze extensies kunt u invoeg-, update- en verwijderbewerkingen uitvoeren.

Standaarden toewijzen

In een tabel kunt u een standaard-XML-exemplaar toewijzen aan een kolom met xml- type. U kunt de standaard-XML op twee manieren opgeven: door een XML-constante te gebruiken of door een expliciete cast te gebruiken naar het xml- type.

Als u de standaard-XML wilt opgeven als een XML-constante, gebruikt u de syntaxis zoals wordt weergegeven in het volgende voorbeeld. De tekenreeks wordt impliciet omgezet naar xml-type.

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

Als u de standaard-XML wilt opgeven als een expliciete CAST voor xml, gebruikt u de syntaxis zoals wordt weergegeven in het volgende voorbeeld.

CREATE TABLE T (XmlColumn xml
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server biedt ook ondersteuning voor NULL- en NOT NULL-beperkingen voor kolommen van xml- type. Bijvoorbeeld:

CREATE TABLE T (XmlColumn xml NOT NULL)

Beperkingen opgeven

Wanneer u kolommen met xml- type maakt, kunt u beperkingen op kolomniveau of tabelniveau definiƫren. Gebruik beperkingen in de volgende situaties:

  • Uw bedrijfsregels kunnen niet worden uitgedrukt in XML-schema's. Het adres van een bloemenwinkel moet bijvoorbeeld binnen 50 mijl van de bedrijfslocatie zijn. Dit kan worden geschreven als een beperking in de XML-kolom. De beperking kan betrekking hebben op xml- gegevenstypemethoden.

  • Uw beperking omvat andere XML- of niet-XML-kolommen in de tabel. Een voorbeeld is het afdwingen van de ID van een klant (/Customer/@CustId) die in een XML-exemplaar is gevonden om overeen te komen met de waarde in een relationele CustomerID-kolom.

U kunt beperkingen opgeven voor getypte of niet-getypte xml- gegevenstypekolommen. U kunt echter niet de xml-gegevenstypemethoden gebruiken wanneer u beperkingen opgeeft.

Het xml- gegevenstype biedt geen ondersteuning voor de volgende kolom- en tabelbeperkingen:

  • PRIMAIRE SLEUTEL/REFERERENDE SLEUTEL

  • UNIEK

  • SORTEREN

    XML biedt een eigen codering. Sorteringen zijn alleen van toepassing op stringtypes. Het xml- gegevenstype is geen tekenreekstype. Het heeft echter wel een tekenreeksrepresentatie en staat het omzetten naar en van tekenreeksgegevenstypen toe.

  • REGEL

Een alternatief voor het gebruik van beperkingen is het maken van een door de gebruiker gedefinieerde functie om de xml-methode van het gegevenstype in te sluiten en deze functie te specificeren in de controlebeperking, zoals getoond in het volgende voorbeeld.

In het volgende voorbeeld geeft de beperking op Col2 aan dat elk XML-exemplaar dat in deze kolom is opgeslagen, een <ProductDescription>-element moet hebben dat een ProductID kenmerk bevat. Deze beperking wordt afgedwongen door deze door de gebruiker gedefinieerde functie:

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN
RETURN @var.exist('/ProductDescription/@ProductID')
END;
GO

De exist() methode van het xml- gegevenstype retourneert 1 als het <ProductDescription> element in het exemplaar het kenmerk ProductID bevat. Anders wordt 0geretourneerd.

U kunt nu als volgt een tabel maken met een beperking op kolomniveau:

CREATE TABLE T (
    Col1 int primary key,
    Col2 xml check(dbo.my_udf(Col2) = 1));
GO

De volgende invoegbewerking slaagt:

INSERT INTO T values(1,'<ProductDescription ProductID="1" />');

Vanwege de beperking mislukt de volgende invoegbewerking:

INSERT INTO T values(1,'<Product />');

Dezelfde of andere tabel

Een kolom van het xml- gegevenstype kan worden gemaakt in een tabel die andere relationele kolommen bevat, of in een afzonderlijke tabel met een vreemde-sleutelrelatie met een hoofdtabel.

Maak een xml- gegevenstypekolom in dezelfde tabel als aan een van de volgende voorwaarden is voldaan:

  • Uw toepassing voert het ophalen van gegevens uit op de XML-kolom en vereist geen XML-index in de XML-kolom.

  • U wilt een XML-index maken op de xml- gegevenstypekolom en de primaire sleutel van de hoofdtabel is hetzelfde als de clusteringsleutel. Zie XML-indexen (SQL Server)voor meer informatie.

Maak de kolom xml- gegevenstype in een afzonderlijke tabel als aan de volgende voorwaarden wordt voldaan:

  • U wilt een XML-index maken op de xml-kolom gegevenstype, maar de primaire sleutel van de hoofdtabel verschilt van de clusteringsleutel, of de hoofdtabel heeft geen primaire sleutel, of de hoofdtabel is een heap (geen clustersleutel). Dit kan waar zijn als de hoofdtabel al bestaat.

  • U wilt niet dat tabelscans vertragen vanwege de aanwezigheid van de XML-kolom in de tabel. Hierbij wordt ruimte gebruikt, ongeacht of deze wordt opgeslagen in de rij of buiten de rij.