Delen via


Door de gebruiker gedefinieerde vereisten (UDT)

van toepassing op:SQL Server-

U moet verschillende belangrijke ontwerpbeslissingen nemen bij het maken van een door de gebruiker gedefinieerd type (UDT) dat moet worden geïnstalleerd in SQL Server. Voor de meeste UDT's wordt het maken van de UDT als een structuur aanbevolen, hoewel het maken als klasse ook een optie is. De UDT-definitie moet voldoen aan de specificaties voor het maken van UDT's om deze te kunnen registreren bij SQL Server.

Vereisten voor het implementeren van UDFT's

Als u wilt uitvoeren in SQL Server, moet uw UDT de volgende vereisten in de UDT-definitie implementeren:

De UDT moet de Microsoft.SqlServer.Server.SqlUserDefinedTypeAttributeopgeven. Het gebruik van de System.SerializableAttribute is optioneel, maar wordt aanbevolen.

  • De UDT moet de System.Data.SqlTypes.INullable interface in de klasse of structuur implementeren door een openbare static (Shared in Visual Basic) te maken Null methode. SQL Server is standaard null-aware. Dit is nodig voor het uitvoeren van code in de UDT om een null-waarde te kunnen herkennen.

  • De UDT moet een openbare static (of Shared) Parse methode bevatten die ondersteuning biedt voor parseren van en een openbare ToString methode voor het converteren naar een tekenreeksweergave van het object.

  • Een UDT met een door de gebruiker gedefinieerde serialisatie-indeling moet de System.Data.IBinarySerialize-interface implementeren en een Read en een Write methode bieden.

  • De UDT moet System.Xml.Serialization.IXmlSerializableimplementeren of alle openbare velden en eigenschappen moeten van de typen zijn die xml serialiseren of zijn ingericht met het kenmerk XmlIgnore als het overschrijven van standaardserialisatie is vereist.

  • Er mag slechts één serialisatie van een UDT-object zijn. Validatie mislukt als de routines voor serialiseren of deserialiseren meer dan één weergave van een bepaald object herkennen.

  • SqlUserDefinedTypeAttribute.IsByteOrdered moet true zijn om gegevens in bytevolgorde te vergelijken. Als de IComparable-interface niet is geïmplementeerd en SqlUserDefinedTypeAttribute.IsByteOrdered is false, mislukken bytevolgordevergelijkingen.

  • Een UDT die in een klasse is gedefinieerd, moet een openbare constructor hebben die geen argumenten accepteert. U kunt desgewenst meer overbelaste klasseconstructors maken.

  • De UDT moet gegevenselementen beschikbaar maken als openbare velden of eigenschapsprocedures.

  • Openbare namen mogen niet langer zijn dan 128 tekens en moeten voldoen aan de SQL Server-naamgevingsregels voor id's zoals gedefinieerd in Database-id's.

  • sql_variant kolommen kunnen geen exemplaren van een UDT bevatten.

  • Overgenomen leden zijn niet toegankelijk vanuit Transact-SQL omdat het SQL Server-typesysteem niet op de hoogte is van de overnamehiërarchie tussen UDT's. U kunt echter overname gebruiken wanneer u uw klassen structureert en u kunt dergelijke methoden aanroepen in de implementatie van beheerde code van het type.

  • Leden kunnen niet worden overbelast, met uitzondering van de klasseconstructor. Als u een overbelaste methode maakt, wordt er geen fout gegenereerd wanneer u de assembly registreert of het type maakt in SQL Server. Detectie van de overbelaste methode vindt plaats tijdens runtime, niet wanneer het type wordt gemaakt. Overbelaste methoden kunnen in de klasse bestaan zolang ze nooit worden aangeroepen. Wanneer u de overbelaste methode hebt aangeroepen, wordt er een fout gegenereerd.

  • Alle static (of Shared) leden moeten worden gedeclareerd als constanten of als alleen-lezen. Statische leden kunnen niet veranderlijk zijn.

  • Als het veld SqlUserDefinedTypeAttribute.MaxByteSize is ingesteld op -1, kan de geserialiseerde UDT zo groot zijn als de limiet voor de grootte van het grote object (momenteel 2 GB). De grootte van de UDT kan niet groter zijn dan de waarde die is opgegeven in het veld MaxByteSized.

Notitie

Hoewel deze niet door de server wordt gebruikt voor het uitvoeren van vergelijkingen, kunt u eventueel de System.IComparable-interface implementeren, die één methode beschikbaar maakt, CompareTo. Dit wordt aan de clientzijde gebruikt in situaties waarin het wenselijk is om UDT-waarden nauwkeurig te vergelijken of te rangschikken.

Systeemeigen serialisatie

Het kiezen van de juiste serialisatiekenmerken voor uw UDT is afhankelijk van het type UDT dat u probeert te maken. De Native serialisatie-indeling maakt gebruik van een eenvoudige structuur waarmee SQL Server een efficiënte systeemeigen weergave van de UDT op schijf kan opslaan. De Native-indeling wordt aanbevolen als de UDT eenvoudig is en alleen velden van de volgende typen bevat:

bool, byte, , short, ushort, int, uint, lange, ulong, float, dubbele, , , , , , , , ,

Waardetypen die bestaan uit velden van deze typen zijn goede kandidaten voor Native indeling, zoals struct in C# of Structure zoals ze bekend zijn in Visual Basic .NET. Een UDT die is opgegeven met de Native serialisatie-indeling kan bijvoorbeeld een veld bevatten van een andere UDT die ook is opgegeven met de Native-indeling. Als de UDT-definitie complexer is en gegevenstypen bevat die niet in de vorige lijst staan, moet u in plaats daarvan de UserDefined serialisatie-indeling opgeven.

De indeling Native heeft de volgende vereisten:

  • Het type mag geen waarde voor Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSizeopgeven.

  • Alle velden moeten serialiseerbaar zijn.

  • De System.Runtime.InteropServices.StructLayoutAttribute moet worden opgegeven als StructLayout.LayoutKindSequential als de UDT is gedefinieerd in een klasse en niet als een structuur. Dit kenmerk bepaalt de fysieke indeling van de gegevensvelden en wordt gebruikt om af te dwingen dat de leden worden ingedeeld in de volgorde waarin ze worden weergegeven. SQL Server gebruikt dit kenmerk om de veldvolgorde voor UDT's met meerdere waarden te bepalen.

Zie de Point UDT in Door de gebruiker gedefinieerde typen maken met ADO.NETvoor een voorbeeld van een UDT die is gedefinieerd met Native serialisatie.

Door gebruiker gedefinieerde serialisatie

De UserDefined-indelingsinstelling voor het kenmerk Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute geeft de ontwikkelaar volledige controle over de binaire indeling. Wanneer u de eigenschap Format kenmerk opgeeft als UserDefined, moet u de volgende acties uitvoeren in uw code:

  • Geef de optionele eigenschap IsByteOrdered kenmerk op. De standaardwaarde is false.

  • Geef de eigenschap MaxByteSize van het Microsoft.SqlServer.Server.SqlUserDefinedTypeAttributeop.

  • Schrijf code om Read en Write methoden voor de UDT te implementeren door de System.Data.Sql.IBinarySerialize-interface te implementeren.

Zie de Valuta-UDT in Door de gebruiker gedefinieerde typen maken met ADO.NETvoor een voorbeeld van een UDT die is gedefinieerd met UserDefined serialisatie.

Notitie

UDT-velden moeten systeemeigen serialisatie gebruiken of persistent zijn om te worden geïndexeerd.

Serialisatiekenmerken

Kenmerken bepalen hoe serialisatie wordt gebruikt om de opslagweergave van UDT's samen te stellen en UDT's per waarde naar de client te verzenden. U moet de Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute opgeven bij het maken van de UDT. Het kenmerk Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute geeft aan dat de klasse een UDT is en de opslag voor de UDT opgeeft. U kunt desgewenst het Serializable kenmerk opgeven, hoewel dit niet vereist is voor SQL Server.

De Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute heeft de volgende eigenschappen.

Formatteren

Hiermee geeft u de serialisatie-indeling op, die kan worden Native of UserDefined, afhankelijk van de gegevenstypen van de UDT.

IsByteOrdered

Een Boolean waarde die bepaalt hoe SQL Server binaire vergelijkingen uitvoert op de UDT.

IsFixedLength

Geeft aan of alle exemplaren van deze UDT dezelfde lengte hebben.

MaxByteSize

De maximale grootte van het exemplaar in bytes. U moet MaxByteSize opgeven met de UserDefined serialisatie-indeling. Voor een UDT met door de gebruiker gedefinieerde serialisatie verwijst MaxByteSize naar de totale grootte van de UDT in de geserialiseerde vorm, zoals gedefinieerd door de gebruiker. De waarde van MaxByteSize moet zich in het bereik van 1 tot 8000of ingesteld op -1 om aan te geven dat de UDT groter is dan 8000 bytes (de totale grootte mag niet groter zijn dan de maximale LOB-grootte). Overweeg een UDT met een eigenschap van een tekenreeks van 10 tekens (System.Char). Wanneer de UDT wordt geserialiseerd met behulp van een BinaryWriter, is de totale grootte van de geserialiseerde tekenreeks 22 bytes: 2 bytes per Unicode UTF-16 teken, vermenigvuldigd met het maximum aantal tekens, plus 2 besturingsbytes aan overhead die wordt gemaakt door het serialiseren van een binaire stream. Daarom moet bij het bepalen van de waarde van MaxByteSizede totale grootte van de geserialiseerde UDT worden overwogen: de grootte van de gegevens die in binaire vorm worden geserialiseerd plus de overhead die wordt gemaakt door serialisatie.

ValidationMethodName

De naam van de methode die wordt gebruikt om instanties van de UDT te valideren.

Set isbyteordered

Wanneer de eigenschap Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered is ingesteld op true, garandeert u dat de geserialiseerde binaire gegevens kunnen worden gebruikt voor de semantische volgorde van de informatie. Elk exemplaar van een UDT-object met byteorde kan dus slechts één geserialiseerde weergave hebben. Wanneer een vergelijkingsbewerking wordt uitgevoerd in SQL Server op de geserialiseerde bytes, moeten de resultaten hetzelfde zijn als wanneer dezelfde vergelijkingsbewerking in beheerde code heeft plaatsgevonden. De volgende functies worden ook ondersteund wanneer IsByteOrdered is ingesteld op true:

  • De mogelijkheid om indexen te maken voor kolommen van dit type.

  • De mogelijkheid om primaire en refererende sleutels te maken, evenals CHECK en UNIQUE beperkingen voor kolommen van dit type.

  • De mogelijkheid om Transact-SQL ORDER BY, GROUP BYen PARTITION BY componenten te gebruiken. In deze gevallen wordt de binaire weergave van het type gebruikt om de volgorde te bepalen.

  • De mogelijkheid om vergelijkingsoperatoren te gebruiken in Transact-SQL instructies.

  • De mogelijkheid om berekende kolommen van dit type te behouden.

Zowel de Native- als UserDefined serialisatie-indelingen ondersteunen de volgende vergelijkingsoperatoren wanneer IsByteOrdered is ingesteld op true:

  • Gelijk aan (=)
  • Niet gelijk aan (!=)
  • Groter dan (>)
  • Kleiner dan (<)
  • Groter dan of gelijk aan (>=)
  • Kleiner dan of gelijk aan (<=)

Null-uitvoerbaarheid implementeren

Naast het correct opgeven van de kenmerken voor uw assembly's, moet uw klasse ook ondersteuning bieden voor null-baarheid. UDT's die in SQL Server zijn geladen, zijn null-aware, maar om de UDT een null-waarde te laten herkennen, moet de klasse de INullable-interface implementeren. Zie Door de gebruiker gedefinieerde typen maken met ADO.NETvoor meer informatie en een voorbeeld van het implementeren van null-uitvoerbaarheid in een UDT.

Tekenreeksconversies

Als u tekenreeksconversie naar en van de UDT wilt ondersteunen, moet u een Parse methode en een ToString methode in uw klasse opgeven. Met de methode Parse kan een tekenreeks worden geconverteerd naar een UDT. Deze moet worden gedeclareerd als static (of Shared in Visual Basic) en moet een parameter van het type System.Data.SqlTypes.SqlStringgebruiken. Zie Door de gebruiker gedefinieerde typen maken met ADO.NETvoor meer informatie en een voorbeeld van het implementeren van de methoden Parse en ToString.

XML-serialisatie

UDT's moeten conversie van en naar het xml- gegevenstype ondersteunen door te voldoen aan het contract voor XML-serialisatie. De System.Xml.Serialization-naamruimte bevat klassen die worden gebruikt om objecten te serialiseren in XML-indelingsdocumenten of streams. U kunt ervoor kiezen om xml- serialisatie te implementeren met behulp van de IXmlSerializable-interface, die aangepaste opmaak biedt voor XML-serialisatie en deserialisatie.

Naast het uitvoeren van expliciete conversies van UDT naar xml-, kunt u met XML-serialisatie het volgende doen:

  • Gebruik XQuery over waarden van UDT-exemplaren na conversie naar het xml- gegevenstype.

  • Gebruik UDFT's in geparameteriseerde query's en webmethoden met systeemeigen XML-webservices in SQL Server.

  • UDF's gebruiken om een bulksgewijs laden van XML-gegevens te ontvangen.

  • Serialiseer DataSets die tabellen met UDT-kolommen bevatten.

UDT's worden niet geserialiseerd in FOR XML-query's. Als u een FOR XML-query wilt uitvoeren waarmee de XML-serialisatie van UDF's wordt weergegeven, converteert u elke UDT-kolom expliciet naar het XML- gegevenstype in de SELECT-instructie. U kunt de kolommen ook expliciet converteren naar varbinaire, varcharof nvarchar.