Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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.INullablew klasie lub strukturze, tworząc publicznąstatic(Sharedw języku Visual Basic)Nullmetodę. 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ęToStringdo konwertowania na reprezentację ciągu obiektu.Funkcja UDT z zdefiniowanym przez użytkownika formatem serializacji musi implementować interfejs
System.Data.IBinarySerializei udostępnićReadi metodęWrite.Funkcja UDT musi implementować
System.Xml.Serialization.IXmlSerializablelub 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.IsByteOrderedmusi byćtrue, aby porównać dane w kolejności bajtów. Jeśli interfejsIComparablenie jest zaimplementowany, aSqlUserDefinedTypeAttribute.IsByteOrderedjestfalse, 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.MaxByteSizejest 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.StructLayoutAttributenależ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 UserDefinednależ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ść
MaxByteSizeMicrosoft.SqlServer.Server.SqlUserDefinedTypeAttribute.Napisz kod, aby zaimplementować metody
ReadiWritedla 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 MaxByteSizenależ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
CHECKiUNIQUEograniczeń dotyczących kolumn tego typu.Możliwość używania klauzul Transact-SQL
ORDER BY,GROUP BYiPARTITION 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