Udostępnij za pośrednictwem


Wymagania dotyczące typu zdefiniowanego przez użytkownika (UDT)

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 (lub Shared) 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.IXmlSerializablelub wszystkie pola publiczne i właściwości muszą być typami, które można serializować xml lub ozdobić atrybutem XmlIgnore, 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 interfejs IComparable nie jest zaimplementowany, a SqlUserDefinedTypeAttribute.IsByteOrdered jest false, 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 (lub Shared) 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 polu MaxByteSized.

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:

bool , bajtów, sbyte , short, ushort, int, uint, długi , , zmiennoprzecinkowe, podwójne, , , , , , , , ,

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ć jako StructLayout.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 to false.

  • Określ właściwość MaxByteSizeMicrosoft.SqlServer.Server.SqlUserDefinedTypeAttribute.

  • Napisz kod, aby zaimplementować metody Read i Write dla funkcji UDT przez zaimplementowanie interfejsu System.Data.Sql.IBinarySerialize.

Aby zapoznać się z przykładem zdefiniowanego przez użytkownika udT z serializacji , zobacz Currency UDT in Create user-defined types with ADO.NET( Tworzenie typów zdefiniowanych przez użytkownika za pomocą ADO.NET).

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 CHECK i UNIQUE ograniczeń dotyczących kolumn tego typu.

  • Możliwość używania klauzul Transact-SQL ORDER BY, GROUP BYi PARTITION 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 Create user-defined types with ADO.NET(Tworzenie typów zdefiniowanych przez użytkownika za pomocą ADO.NET).

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 i , zobacz Create user-defined types with ADO.NET(Tworzenie typów zdefiniowanych przez użytkownika za pomocą ADO.NET).

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 , varcharlub nvarchar.