Benutzerdefinierte Typanforderungen (UDT)
Gilt für:SQL Server
Sie müssen beim Erstellen eines benutzerdefinierten Typs (USER-Defined Type, UDT) mehrere wichtige Entwurfsentscheidungen treffen, die in SQL Server installiert werden sollen. Für die meisten UDTs wird das Erstellen als Struktur empfohlen, obwohl auch das Erstellen als Klasse möglich ist. Die UDT-Definition muss den Spezifikationen für das Erstellen von UDTs entsprechen, damit sie bei SQL Server registriert werden kann.
Anforderungen für die Implementierung von UDTs
Zur Ausführung in SQL Server muss Ihr UDT die folgenden Anforderungen in der UDT-Definition implementieren:
Das UDT muss die Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
angeben. Die Verwendung der System.SerializableAttribute
ist optional, wird jedoch empfohlen.
Das UDT muss die
System.Data.SqlTypes.INullable
-Schnittstelle in der Klasse oder Struktur implementieren, indem eine öffentlichestatic
(Shared
in Visual Basic)Null
-Methode erstellt wird. SQL Server ist standardmäßig nullfähig. Dies ist notwendig für Code, der im UDT ausgeführt wird, um in der Lage zu sein, einen NULL-Wert zu erkennen.Das UDT muss eine öffentliche
static
(oderShared
)Parse
Methode enthalten, die die Analyse unterstützt, und eine öffentlicheToString
-Methode zum Konvertieren in eine Zeichenfolgendarstellung des Objekts.Ein UDT mit einem benutzerdefinierten Serialisierungsformat muss die
System.Data.IBinarySerialize
Schnittstelle implementieren und eineRead
und eineWrite
Methode bereitstellen.Das UDT muss
System.Xml.Serialization.IXmlSerializable
implementieren, oder alle öffentlichen Felder und Eigenschaften müssen Typen sein, die xml serialisierbar oder mit dem attributXmlIgnore
versehen werden können, wenn die Standard serialisierung überschrieben werden muss.Es darf nur eine Serialisierung eines UDT-Objekts geben. Die Überprüfung schlägt fehl, wenn die Serialisierungs- oder Deserialisierungsroutinen mehr als eine Darstellung eines bestimmten Objekts erkennen.
SqlUserDefinedTypeAttribute.IsByteOrdered
müssentrue
sein, um Daten in Bytereihenfolge zu vergleichen. Wenn dieIComparable
Schnittstelle nicht implementiert ist undSqlUserDefinedTypeAttribute.IsByteOrdered
false
ist, schlagen Bytereihenfolgevergleiche fehl.Ein in einer Klasse definierter UDT muss über einen öffentlichen Konstruktor verfügen, der keine Argumente verwendet. Sie können optional weitere überladene Klassenkonstruktoren erstellen.
Der UDT muss Datenelemente als öffentliche Felder oder Eigenschaftenprozeduren verfügbar machen.
Öffentliche Namen dürfen nicht länger als 128 Zeichen sein und müssen den SQL Server-Benennungsregeln für Bezeichner entsprechen, die in Datenbankbezeichnerndefiniert sind.
sql_variant Spalten dürfen keine Instanzen eines UDT enthalten.
Auf geerbte Member kann nicht über Transact-SQL zugegriffen werden, da das SQL Server-Typsystem die Vererbungshierarchie zwischen UDTs nicht kennt. Sie können Vererbung allerdings verwenden, wenn Sie Klassen strukturieren, und Sie können diese Methoden in der verwalteten Codeimplementierung des Typs aufrufen.
Elemente können nicht überladen werden, mit Ausnahme des Klassenkonstruktors. Wenn Sie eine überladene Methode erstellen, wird kein Fehler ausgelöst, wenn Sie die Assembly registrieren oder den Typ in SQL Server erstellen. Erkennung der überladenen Methode tritt zur Laufzeit auf, nicht beim Erstellen des Typs. Überladene Methoden können in der Klasse vorhanden sein, solange sie nie aufgerufen werden. Sobald Sie eine überladene Methode aufrufen, wird ein Fehler ausgelöst.
Alle
static
(oderShared
) Member müssen als Konstanten oder als schreibgeschützt deklariert werden. Statische Member können nicht stummgeschaltet werden.Wenn das feld
SqlUserDefinedTypeAttribute.MaxByteSize
auf-1
festgelegt ist, kann das serialisierte UDT so groß wie die Größenbeschränkung für große Objekte (LOB) sein (derzeit 2 GB). Die Größe des UDT kann den im feldMaxByteSized
angegebenen Wert nicht überschreiten.
Hinweis
Obwohl sie nicht vom Server zum Ausführen von Vergleichen verwendet wird, können Sie optional die System.IComparable
Schnittstelle implementieren, die eine einzelne Methode verfügbar macht, CompareTo
. Dies wird auf der Clientseite in Situationen verwendet, in denen es wünschenswert ist, UDT-Werte genau zu vergleichen oder zu bestellen.
Native Serialisierung
Die Auswahl der richtigen Serialisierungsattribute für Ihr UDT hängt vom Typ des UDT ab, den Sie erstellen möchten. Das Native
Serialisierungsformat verwendet eine einfache Struktur, mit der SQL Server eine effiziente native Darstellung des UDT auf dem Datenträger speichern kann. Das Native
-Format wird empfohlen, wenn das UDT einfach ist und nur Felder der folgenden Typen enthält:
Werttypen, die aus Feldern dieser Typen bestehen, sind gute Kandidaten für Native
Format, z. B. struct
in C# oder Structure
, wie sie in Visual Basic .NET bekannt sind. Beispielsweise kann ein mit dem Native
Serialisierungsformat angegebenes UDT ein Feld eines anderen UDT enthalten, das auch mit dem Native
-Format angegeben wurde. Wenn die UDT-Definition komplexer ist und Datentypen enthält, die nicht in der vorherigen Liste enthalten sind, müssen Sie stattdessen das UserDefined
Serialisierungsformat angeben.
Das Native
-Format hat die folgenden Anforderungen:
Der Typ darf keinen Wert für
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize
angeben.Alle Felder müssen serialisierbar sein.
Die
System.Runtime.InteropServices.StructLayoutAttribute
muss alsStructLayout.LayoutKindSequential
angegeben werden, wenn das UDT in einer Klasse und nicht in einer Struktur definiert ist. Dieses Attribut steuert das physische Layout der Datenfelder und wird verwendet, um zu erzwingen, dass die Elemente in der Reihenfolge angeordnet werden, in der sie erscheinen. SQL Server verwendet dieses Attribut, um die Feldreihenfolge für UDTs mit mehreren Werten zu bestimmen.
Ein Beispiel für ein UDT, das mit Native
Serialisierung definiert ist, finden Sie im Point
UDT in Erstellen benutzerdefinierter Typen mit ADO.NET.
UserDefined Serialisierung
Die UserDefined
Formateinstellung für das attribut Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
bietet dem Entwickler die vollständige Kontrolle über das Binärformat. Wenn Sie die attributeigenschaft Format
als UserDefined
angeben, müssen Sie die folgenden Aktionen in Ihrem Code ausführen:
Geben Sie die optionale
IsByteOrdered
Attributeigenschaft an. Der Standardwert istfalse
.Geben Sie die
MaxByteSize
-Eigenschaft desMicrosoft.SqlServer.Server.SqlUserDefinedTypeAttribute
an.Schreiben Sie Code, um
Read
- undWrite
Methoden für das UDT zu implementieren, indem Sie dieSystem.Data.Sql.IBinarySerialize
Schnittstelle implementieren.
Ein Beispiel für ein UDT, das mit UserDefined
Serialisierung definiert ist, finden Sie unter "Currency UDT" in Erstellen benutzerdefinierter Typen mit ADO.NET.
Hinweis
Für UDT-Felder muss die systemeigene Serialisierung verwendet werden, oder die Felder müssen erhalten bleiben, um indiziert zu werden.
Serialisierungsattribute
Attribute bestimmen, wie die Serialisierung verwendet wird, um die Speicherdarstellung von UDTs zu erstellen und um UDTs durch Werte an den Client zu übertragen. Sie müssen die Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
beim Erstellen des UDT angeben. Das attribut Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
gibt an, dass die Klasse ein UDT ist und den Speicher für udT angibt. Sie können optional das Serializable
-Attribut angeben, obwohl SQL Server dies nicht erfordert.
Die Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
weist die folgenden Eigenschaften auf.
Format
Gibt das Serialisierungsformat an, das je nach Datentypen des UDT Native
oder UserDefined
werden kann.
IsByteOrdered
Ein Boolean
Wert, der bestimmt, wie SQL Server binäre Vergleiche für udT durchführt.
IsFixedLength
Gibt an, ob alle Instanzen dieses UDTs dieselbe Länge haben.
MaxByteSize
Die maximale Größe der Instanz in Byte. Sie müssen MaxByteSize
mit dem UserDefined
Serialisierungsformat angeben. Bei einem UDT mit der angegebenen benutzerdefinierten Serialisierung bezieht sich MaxByteSize
auf die Gesamtgröße des UDT in serialisierter Form, wie vom Benutzer definiert. Der Wert von MaxByteSize
muss sich im Bereich von 1
auf 8000
befinden oder auf -1
festlegen, um anzugeben, dass das UDT größer als 8.000 Byte ist (die Gesamtgröße kann die maximale Branchengröße nicht überschreiten). Betrachten Sie ein UDT mit einer Eigenschaft von 10 Zeichen (System.Char
). Wenn der UDT anhand eines BinaryWriter serialisiert wird, beträgt die Gesamtgröße der serialisierten Zeichenfolge 22 Byte: 2 Byte pro Unicode-UTF-16-Zeichen, multipliziert mit der maximalen Anzahl von Zeichen, plus 2 Kontrollzeichen, die beim Serialisieren eines binären Datenstroms zusätzlich anfallen. Daher muss bei der Ermittlung des Werts von MaxByteSize
die Gesamtgröße des serialisierten UDT berücksichtigt werden: die Größe der in binärer Form serialisierten Daten sowie den Aufwand, der durch die Serialisierung entsteht.
ValidationMethodName
Der Name der Methode, mit der Instanzen des UDTs überprüft werden.
Set isbyteordered
Wenn die Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered
-Eigenschaft auf true
festgelegt ist, garantieren Sie, dass die serialisierten Binärdaten für die semantische Anordnung der Informationen verwendet werden können. So kann jede Instanz eines UDT-Objekts mit Bytereihenfolge nur eine einzige serialisierte Darstellung haben. Wenn ein Vergleichsvorgang in SQL Server in den serialisierten Bytes ausgeführt wird, sollten die Ergebnisse identisch sein, als ob derselbe Vergleichsvorgang im verwalteten Code ausgeführt wurde. Die folgenden Features werden auch unterstützt, wenn IsByteOrdered
auf true
festgelegt ist:
Die Fähigkeit zum Erstellen von Indizes für Spalten dieses Typs
Die Möglichkeit zum Erstellen von Primär- und Fremdschlüsseln sowie
CHECK
undUNIQUE
Einschränkungen für Spalten dieses Typs.Die Möglichkeit, Transact-SQL
ORDER BY
,GROUP BY
undPARTITION BY
Klauseln zu verwenden. In diesen Fällen wird die binäre Darstellung des Typs verwendet, um die Reihenfolge zu bestimmenDie Möglichkeit, Vergleichsoperatoren in Transact-SQL-Anweisungen zu verwenden.
Die Fähigkeit, berechnete Spalten dieses Typs persistent zu speichern
Sowohl das Native
- als auch das UserDefined
Serialisierungsformat unterstützen die folgenden Vergleichsoperatoren, wenn IsByteOrdered
auf true
festgelegt ist:
- Gleich (
=
) - Ungleich (
!=
) - Größer als (
>
) - Kleiner als (
<
) - Größer als oder gleich (
>=
) - Kleiner oder gleich (
<=
)
Implementieren der Nullierbarkeit
Zusätzlich zum ordnungsgemäßen Angeben der Attribute für die Assemblys muss die Klasse auch NULL-Zulässigkeit unterstützen. UDTs, die in SQL Server geladen wurden, sind nullfähig. Damit udT jedoch einen Nullwert erkennt, muss die Klasse die INullable
-Schnittstelle implementieren. Weitere Informationen und ein Beispiel für die Implementierung der Nullierbarkeit in einem UDT finden Sie unter Erstellen benutzerdefinierter Typen mit ADO.NET.
Zeichenfolgenkonvertierungen
Um die Zeichenfolgenkonvertierung in und aus dem UDT zu unterstützen, müssen Sie eine Parse
Methode und eine ToString
-Methode in Ihrer Klasse bereitstellen. Mit der Parse
-Methode kann eine Zeichenfolge in ein UDT konvertiert werden. Sie muss als static
(oder Shared
in Visual Basic) deklariert werden und einen Parameter vom Typ System.Data.SqlTypes.SqlString
verwenden. Weitere Informationen und ein Beispiel für die Implementierung der methoden Parse
und ToString
finden Sie unter Erstellen von benutzerdefinierten Typen mit ADO.NET.
XML-Serialisierung
UDTs müssen die Konvertierung in den xml-Datentyp unterstützen, indem sie dem Vertrag für die XML-Serialisierung entsprechen. Der System.Xml.Serialization
-Namespace enthält Klassen, die zum Serialisieren von Objekten in XML-Formatdokumente oder Datenströme verwendet werden. Sie können XML- Serialisierung mithilfe der IXmlSerializable
Schnittstelle implementieren, die benutzerdefinierte Formatierung für die XML-Serialisierung und Deserialisierung bereitstellt.
Zusätzlich zum Ausführen expliziter Konvertierungen von UDT in XML ermöglicht ihnen die XML-Serialisierung Folgendes:
Verwenden Sie XQuery über Werte von UDT-Instanzen nach der Konvertierung in den XML- Datentyp.
Verwenden Sie UDTs in parametrisierten Abfragen und Webmethoden mit nativen XML-Webdiensten in SQL Server.
Verwenden von UDTs, um ein Massenladen von XML-Daten durchzuführen.
Serialisieren von DataSets, die Tabellen mit UDT-Spalten enthalten.
UDTs werden in FOR XML-Abfragen nicht serialisiert. Um eine FOR XML-Abfrage auszuführen, die die XML-Serialisierung von UDTs anzeigt, konvertieren Sie jede UDT-Spalte explizit in den XML- Datentyp in der SELECT
-Anweisung. Sie können die Spalten auch explizit in varbinary, varchar oder nvarchar konvertieren.