Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:programu SQL Server
Podczas tworzenia typu zdefiniowanego przez użytkownika (UDT) należy podjąć kilka ważnych decyzji projektowych, które mają zostać zainstalowane w programie SQL Server. W przypadku większości tras zdefiniowanych przez użytkownika zaleca się utworzenie funkcji UDT jako struktury, chociaż utworzenie jej jako klasy jest również opcją. Definicja udT musi być zgodna ze specyfikacjami tworzenia tras zdefiniowanych przez użytkownika, aby można było je zarejestrować w programie SQL Server.
Wymagania dotyczące implementowania tras zdefiniowanych przez użytkownika
Aby uruchomić program SQL Server, funkcja UDT musi zaimplementować następujące wymagania w definicji udT:
Funkcja UDT musi określać Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
. Użycie System.SerializableAttribute
jest opcjonalne, ale zalecane.
Funkcja UDT musi zaimplementować interfejs
System.Data.SqlTypes.INullable
w klasie lub strukturze, tworząc publicznąstatic
(Shared
w języku Visual Basic)Null
metodę. Program SQL Server domyślnie ma świadomość wartości null. Jest to konieczne, aby kod wykonywany w udT mógł rozpoznać wartość null.Funkcja UDT musi zawierać publiczną metodę
static
(lubShared
)Parse
, która obsługuje analizowanie, oraz publiczną metodęToString
do konwertowania na reprezentację ciągu obiektu.Funkcja UDT z zdefiniowanym przez użytkownika formatem serializacji musi implementować interfejs
System.Data.IBinarySerialize
i udostępnićRead
i metodęWrite
.Funkcja UDT musi implementować
System.Xml.Serialization.IXmlSerializable
lub wszystkie pola publiczne i właściwości muszą być typami, które można serializować xml lub ozdobić atrybutemXmlIgnore
, jeśli wymagana jest zastępowanie standardowej serializacji.Musi istnieć tylko jedna serializacja obiektu UDT. Walidacja nie powiedzie się, jeśli serializacji lub deserializacji procedur rozpoznają więcej niż jedną reprezentację określonego obiektu.
SqlUserDefinedTypeAttribute.IsByteOrdered
musi byćtrue
, aby porównać dane w kolejności bajtów. Jeśli interfejsIComparable
nie jest zaimplementowany, aSqlUserDefinedTypeAttribute.IsByteOrdered
jestfalse
, porównania kolejności bajtów kończą się niepowodzeniem.Funkcja UDT zdefiniowana w klasie musi mieć publiczny konstruktor, który nie przyjmuje żadnych argumentów. Opcjonalnie można utworzyć więcej przeciążonych konstruktorów klas.
Funkcja UDT musi uwidaczniać elementy danych jako pola publiczne lub procedury właściwości.
Nazwy publiczne nie mogą być dłuższe niż 128 znaków i muszą być zgodne z regułami nazewnictwa programu SQL Server dla identyfikatorów zdefiniowanych w Identyfikatory bazy danych.
sql_variant kolumny nie mogą zawierać wystąpień udT.
Dziedziczone elementy członkowskie nie są dostępne z Transact-SQL, ponieważ system typów programu SQL Server nie zna hierarchii dziedziczenia między węzłami ZDEFINIOWANYmi przez użytkownika. Można jednak użyć dziedziczenia podczas tworzenia struktury klas i można wywołać takie metody w implementacji kodu zarządzanego typu.
Składowe nie mogą być przeciążone, z wyjątkiem konstruktora klasy. Jeśli utworzysz metodę przeciążoną, podczas rejestrowania zestawu ani tworzenia typu w programie SQL Server nie zostanie zgłoszony żaden błąd. Wykrywanie przeciążonej metody występuje w czasie wykonywania, a nie podczas tworzenia typu. Metody przeciążone mogą istnieć w klasie, o ile nigdy nie są wywoływane. Po wywołaniu metody przeciążonej zostanie zgłoszony błąd.
Wszystkie
static
(lubShared
) składowe muszą być zadeklarowane jako stałe lub tylko do odczytu. Statyczne elementy członkowskie nie mogą być modyfikowalne.Jeśli pole
SqlUserDefinedTypeAttribute.MaxByteSize
jest ustawione na-1
, serializowany udT może być tak duży, jak limit rozmiaru dużego obiektu (LOB) (obecnie 2 GB). Rozmiar funkcji UDT nie może przekraczać wartości określonej w poluMaxByteSized
.
Nuta
Mimo że nie jest używany przez serwer do przeprowadzania porównań, opcjonalnie można zaimplementować interfejs System.IComparable
, który uwidacznia jedną metodę, CompareTo
. Jest to używane po stronie klienta w sytuacjach, w których pożądane jest dokładne porównanie lub kolejność wartości UDT.
Serializacja natywna
Wybór odpowiednich atrybutów serializacji dla udT zależy od typu udT, który próbujesz utworzyć. Format serializacji Native
wykorzystuje prostą strukturę, która umożliwia programowi SQL Server przechowywanie wydajnej natywnej reprezentacji udT na dysku. Format Native
jest zalecany, jeśli funkcja UDT jest prosta i zawiera tylko pola następujących typów:
Typy wartości składające się z pól tych typów są dobrymi kandydatami do formatu Native
, takiego jak struct
w języku C#, lub Structure
, ponieważ są one znane w języku Visual Basic .NET. Na przykład funkcja UDT określona z formatem serializacji Native
może zawierać pole innego udT, które zostało również określone w formacie Native
. Jeśli definicja UDT jest bardziej złożona i zawiera typy danych, które nie znajdują się na poprzedniej liście, należy określić UserDefined
format serializacji.
Format Native
ma następujące wymagania:
Typ nie może określać wartości dla
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize
.Wszystkie pola muszą być serializowalne.
System.Runtime.InteropServices.StructLayoutAttribute
należy określić jakoStructLayout.LayoutKindSequential
, jeśli funkcja UDT jest zdefiniowana w klasie, a nie w strukturze. Ten atrybut steruje fizycznym układem pól danych i służy do wymuszania układu elementów członkowskich w kolejności ich wyświetlania. Program SQL Server używa tego atrybutu do określenia kolejności pól dla tras zdefiniowanych przez użytkownika z wieloma wartościami.
Aby zapoznać się z przykładem funkcji UDT zdefiniowanej z serializacji Native
, zobacz Point
UDT w Tworzenie typów zdefiniowanych przez użytkownika za pomocą ADO.NET.
UserDefined serializacja
Ustawienie formatu UserDefined
atrybutu Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
zapewnia deweloperowi pełną kontrolę nad formatem binarnym. Podczas określania właściwości atrybutu Format
jako UserDefined
należy wykonać następujące akcje w kodzie:
Określ opcjonalną właściwość atrybutu
IsByteOrdered
. Wartość domyślna tofalse
.Określ właściwość
MaxByteSize
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
.Napisz kod, aby zaimplementować metody
Read
iWrite
dla funkcji UDT przez zaimplementowanie interfejsuSystem.Data.Sql.IBinarySerialize
.
Aby zapoznać się z przykładem zdefiniowanego przez użytkownika udT z serializacji
Nuta
Pola UDT muszą używać natywnej serializacji lub być utrwalane w celu indeksowania.
Atrybuty serializacji
Atrybuty określają sposób użycia serializacji do konstruowania reprezentacji magazynu tras ZDEFINIOWANYch przez użytkownika i przesyłania tras zdefiniowanych przez wartość do klienta. Musisz określić Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
podczas tworzenia funkcji UDT. Atrybut Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
wskazuje, że klasa jest udT i określa magazyn udT. Opcjonalnie można określić atrybut Serializable
, chociaż program SQL Server nie wymaga tego.
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
ma następujące właściwości.
Format
Określa format serializacji, który może być Native
lub UserDefined
, w zależności od typów danych UDT.
IsByteOrdered
Wartość Boolean
określająca sposób wykonywania porównań binarnych w usłudze UDT przez program SQL Server.
IsFixedLength
Wskazuje, czy wszystkie wystąpienia tego udT mają taką samą długość.
MaxByteSize
Maksymalny rozmiar wystąpienia w bajtach. Należy określić MaxByteSize
z formatem serializacji UserDefined
. W przypadku funkcji UDT z określoną serializacji zdefiniowaną przez użytkownika MaxByteSize
odnosi się do całkowitego rozmiaru udT w postaci serializowanej zdefiniowanej przez użytkownika. Wartość MaxByteSize
musi znajdować się w zakresie 1
, aby 8000
, lub ustawić wartość -1
, aby wskazać, że funkcja UDT jest większa niż 8000 bajtów (całkowity rozmiar nie może przekraczać maksymalnego rozmiaru loB). Rozważ użycie funkcji UDT z właściwością ciągu o długości 10 znaków (System.Char
). Gdy funkcja UDT jest serializowana przy użyciu funkcji BinaryWriter, łączny rozmiar serializacji ciągu wynosi 22 bajty: 2 bajty na znak Unicode UTF-16, pomnożony przez maksymalną liczbę znaków, a także 2 bajty kontrolne obciążenia wynikające z serializacji strumienia binarnego. W związku z tym podczas określania wartości MaxByteSize
należy rozważyć całkowity rozmiar serializowanego udT: rozmiar danych serializowanych w postaci binarnej oraz nakład pracy związany z serializacji.
ValidationMethodName
Nazwa metody używanej do weryfikowania wystąpień udT.
Ustawianie kolejności isbyteordered
Gdy właściwość Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered
jest ustawiona na true
, gwarantujesz, że serializowane dane binarne mogą być używane do semantycznego porządkowania informacji. W związku z tym każde wystąpienie obiektu UDT uporządkowanego według bajtów może mieć tylko jedną serializowaną reprezentację. Po wykonaniu operacji porównania w programie SQL Server na serializowanych bajtach jego wyniki powinny być takie same, jak w przypadku, gdy ta sama operacja porównania miała miejsce w kodzie zarządzanym. Następujące funkcje są również obsługiwane, gdy IsByteOrdered
jest ustawiona na true
:
Możliwość tworzenia indeksów w kolumnach tego typu.
Możliwość tworzenia kluczy podstawowych i obcych, a także
CHECK
iUNIQUE
ograniczeń dotyczących kolumn tego typu.Możliwość używania klauzul Transact-SQL
ORDER BY
,GROUP BY
iPARTITION BY
. W takich przypadkach reprezentacja binarna typu służy do określania kolejności.Możliwość używania operatorów porównania w instrukcjach Transact-SQL.
Możliwość utrwalania obliczonych kolumn tego typu.
Formaty serializacji Native
i UserDefined
obsługują następujące operatory porównania, gdy IsByteOrdered
jest ustawiona na true
:
- Równe (
=
) - Nie równa się (
!=
) - Większe niż (
>
) - Mniej niż (
<
) - Większe niż lub równe (
>=
) - Mniejsze niż lub równe (
<=
)
Implementowanie wartości null
Oprócz poprawnego określania atrybutów dla zestawów klasa musi również obsługiwać wartość null. Trasy zdefiniowane przez użytkownika załadowane do programu SQL Server mają wartość null, ale aby funkcja UDT rozpoznawała wartość null, klasa musi zaimplementować interfejs INullable
. Aby uzyskać więcej informacji i przykład implementacji wartości null w funkcji UDT, zobacz
Konwersje ciągów
Aby obsługiwać konwersję ciągów do i z udT, należy podać metodę Parse
i metodę ToString
w klasie. Metoda Parse
umożliwia konwertowanie ciągu na udT. Musi być zadeklarowany jako static
(lub Shared
w Visual Basic) i mieć parametr typu System.Data.SqlTypes.SqlString
. Aby uzyskać więcej informacji i przykład implementacji metod
Serializacja XML
UDP muszą obsługiwać konwersję do i z xml typu danych, zgodnie z kontraktem serializacji XML. Przestrzeń nazw System.Xml.Serialization
zawiera klasy używane do serializacji obiektów w dokumentach lub strumieniach w formacie XML. Można zaimplementować serializacji xml przy użyciu interfejsu IXmlSerializable
, który zapewnia niestandardowe formatowanie serializacji i deserializacji XML.
Oprócz przeprowadzania jawnych konwersji z udT do xml, serializacji XML umożliwia:
Użyj zapytania XQuery dla wartości wystąpień UDT po konwersji na xml typu danych.
Użyj nazw ZDEFINIOWANYch w sparametryzowanych zapytaniach i metodach sieci Web z natywnymi usługami sieci Web XML w programie SQL Server.
Użyj tras zdefiniowanych przez użytkownika, aby odbierać zbiorcze ładowanie danych XML.
Serializuj zestawy danych zawierające tabele z kolumnami UDT.
Trasy zdefiniowane przez użytkownika nie są serializowane w zapytaniach XML. Aby wykonać zapytanie FOR XML, które wyświetla serializacji XML udTs, jawnie przekonwertuj każdą kolumnę UDT na xml typu danych w instrukcji SELECT
. Możesz również jawnie przekonwertować kolumny na