Wymagania typ zdefiniowany przez użytkownika

You must make several important design decisions when creating a user-defined type (UDT) to be installed in Microsoft SQL Server.Dla większości UDTs tworzenie UDT jako struktura jest zalecany, chociaż tworzenie go jako klasa jest również opcja.Definicja UDT musi odpowiadać specyfikacji dla tworzenia UDTs ono być zarejestrowany SQL Server.

Wymagania dotyczące wykonania UDTs

Aby uruchomić w SQL Server, Twój UDT musi implementować następujące wymogi definicji UDT:

Należy określić UDT Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.Korzystanie z System.SerializableAttribute jest opcjonalne, ale zalecane.

  • The UDT must implement the System.Data.SqlTypes.INullable interface in the class or structure by creating a public static (Shared in Microsoft Visual Basic) Null method.SQL Server is null-aware by default.Jest to konieczne dla kod wykonywany w UDT mógł rozpoznać wartości null.

  • UDT musi zawierać publicznego static (lub Shared) Parse Metoda obsługujący analizowania i publicznego ToString metodę konwersji do reprezentacji ciąg obiektu.

  • UDT format serializacji użytkownika musi implementować System.Data.IBinarySerialize interfejs i zapewniają Read i Write metoda.

  • UDT musi implementować System.Xml.Serialization.IXmlSerializable, lub wszystkie pola publiczne i właściwości musi być typów XML można serializować lub dekoracyjną z XmlIgnore atrybut, jeśli wymagane jest przesłanianie standardowych serializacji.

  • Musi istnieć tylko jedna serializacji obiektu UDT.Sprawdzanie poprawności nie powiedzie się, jeśli serialize lub deserializacji procedur rozpoznaje reprezentacja więcej niż jednego określonego obiektu.

  • SqlUserDefinedTypeAttribute.IsByteOrderedmusi być true do porównywania danych w kolejności bajtów.Jeśli nie jest zaimplementowany interfejs IComparable i SqlUserDefinedTypeAttribute.IsByteOrdered jest false, kolejność bajtów porównań będą błędów.

  • UDT zdefiniowane w klasie musi mieć publicznego konstruktora, który nie przyjmuje żadnych argumentów.Opcjonalnie można utworzyć dodatkowe klasy przeciążone konstruktorów.

  • UDT musi ujawniać elementów danych jako pola publiczne lub procedur właściwość.

  • Publiczne nazwy nie może być dłuższa niż 128 znaków i musi być zgodny z SQL Server nazewnictwa zasady identyfikatory określone w Identyfikatory.

  • sql_variant kolumny nie może zawierać wystąpienia UDT.

  • Członków dziedziczonych nie są dostępne z Transact-SQL ponieważ SQL Server system typów nie otrzymała hierarchii dziedziczenia wśród UDTs.Jednak dziedziczenie można użyć w celu wykonania kod zarządzany typu można wywołać metody takie, gdy struktura klas.

  • Nie można obciążać członków z wyjątkiem dla konstruktora klasy.Jeśli utworzysz przeciążona metoda, błąd nie jest wywoływane, gdy zarejestrować wirtualny plik dziennika lub utworzyć typ w SQL Server.Wykrywanie przeciążona metoda występuje przy uruchomieniu czas, nie, po utworzeniu typu.Metody przeciążane mogą istnieć w klasie, jak nigdy nie są one wywoływane.Po wywołać przeciążona metoda, uruchamiany jest błąd.

  • Dowolny static (lub Shared) członków musi być zadeklarowana jako stałe lub tylko do odczytu.Elementy statyczne nie mogą być tych.

  • Jeśli SqlUserDefinedTypeAttribute.MaxByteSize pole jest zestaw -1, tak duży jak dużego obiektu (LOB) limit rozmiaru (obecnie 2 GB) może być szeregowana UDT.Rozmiar UDT nie może przekraczać wartości określonej w MaxByteSized pole.

Ostrzeżenie

Chociaż nie jest używany przez serwer do przeprowadzania porównań, opcjonalnie można zaimplementować System.IComparable interfejs, który udostępnia pojedynczą metoda CompareTo.Używany w sytuacjach, w których pożądane jest, aby dokładnie wartości UDT porównania lub zamówienia po stronie klient.

Serializacja macierzystego

Wybieranie atrybutów prawo serializacji dla swojego UDT zależy od typu UDT próbujesz utworzyć. Native Format serializacji wykorzystuje struktury bardzo prostym, który umożliwia SQL Server do przechowywania efektywne macierzystym reprezentacja UDT na dysku.Native Format jest zalecane, jeśli UDT jest prosty i zawiera tylko pola z następujących typów:

bool, byte, sbyte, short, ushort, int, uint, long, ulong, float, double, SqlByte, SqlInt16, SqlInt32, SqlInt64, SqlDateTime, SqlSingle, SqlDouble, SqlMoney, SqlBoolean

Wartość typów, które składają się z pól z powyższych typów są dobrymi kandydatami do Native formatowania, takich jak structs w środowisku Visual C#, (lub Structures , są znane w języku Visual Basic).Na przykład określony typ zdefiniowany przez użytkownika z Native format serializacji może zawierać pole innym UDT określoną również z Native format.Jeśli definicja UDT jest bardziej złożone i zawiera typy danych nie na powyższej liście, należy określić UserDefined serializacji format zamiast.

Native Format ma następujące wymagania:

  • Typ nie może określić wartość dla Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize.

  • Wszystkie pola muszą mieć możliwość serializowania.

  • System.Runtime.InteropServices.StructLayoutAttribute Musi być określona jako StructLayout.LayoutKindSequential Jeśli UDT jest zdefiniowana w klasie i nie struktury.This attribute controls the physical layout of the data fields and is used to force the members to be laid out in the order in which they appear.SQL Server uses this attribute to determine the field order for UDTs with multiple values.

Na przykład typ zdefiniowany przez użytkownika zdefiniowano z Native serializacji Zobacz UDT punktu w Kodowanie typów zdefiniowanych przez użytkownika.

Serializacja UserDefined

UserDefined Format ustawienie dla Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute daje atrybut developer pełną kontrolę nad format binarny.Podczas określania Format Właściwość atrybut jako UserDefined, należy wykonać następujące czynności w kodzie:

  • Określ opcjonalnej IsByteOrdered atrybut właściwość.Wartością domyślną jest false.

  • Określ MaxByteSize Właściwość Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.

  • Napisać kod w celu zaimplementowania Read i Write metody UDT implementując System.Data.Sql.IBinarySerialize interfejs.

Na przykład typ zdefiniowany przez użytkownika zdefiniowano z UserDefined serializacji Zobacz UDT waluty w Kodowanie typów zdefiniowanych przez użytkownika.

Ostrzeżenie

Począwszy od SQL Server 2005 wersja RTM, UDTs CLR serializacji zdefiniowane przez użytkownika zostały może mieć ich pola indeksowane jako część kolumny obliczane - utrwalone lub widoków.W takich sytuacjach może spowodować uszkodzenie indeksu-deterministic UDT serializacji na deserializacji i dlatego został usunięty z SQL Server 2005 z dodatkiem SP1.W SQL Server 2005 z dodatkiem SP1, UDT pól należy użyć serializacji macierzystego lub utrwalone mają być indeksowane.Wszelkie istniejące indeksy dla pól UDT powinny nadal funkcja , jak wcześniej.

Atrybuty serializacji

Atrybuty określają, jak serializacji jest używany do konstruowania reprezentacja Magazyn UDTs i przekazuje UDTs przez wartość do klient.Musisz określić Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute podczas tworzenia UDT.Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute atrybut oznacza, że klasa jest UDT określa Magazyn UDT.Opcjonalnie można określić Serializable atrybut, chociaż SQL Server tego nie wymagają.

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
    A Boolean wartość, która określa sposób SQL Server wykonuje binarne porównania UDT.

  • IsFixedLength
    Wskazuje, czy wszystkie wystąpienia tego UDT są tej samej długości.

  • MaxByteSize
    Maksymalny rozmiar w bajtach wystąpienie.Należy określić MaxByteSize z UserDefined format serializacji.Dla UDT serializacji użytkownika określony MaxByteSize odnosi się do całkowitego rozmiaru UDT w postaci serializowane zdefiniowane przez użytkownika.Wartość MaxByteSize musi być z zakres od 1 do 8000 lub zestaw -1, aby wskazać, że UDT jest większa niż 8000 bajtów (całkowity rozmiar nie może przekraczać maksymalnego rozmiaru obiektu LOB).Należy rozważyć UDT z właściwość ciąg 10 znaków (System.Char).Gdy UDT jest seryjny przy użyciu BinaryWriter, całkowity rozmiar serializowane ciąg jest 22 bajtów: 2 bajty na znak Unicode UTF-16 pomnożona przez maksymalną liczbę znaków plus 2 kontroli nadmiarowej z szeregowania binarny strumień bajtów.Dlatego przy określaniu wartości MaxByteSize, należy uwzględnić całkowity rozmiar serializowane UDT: rozmiar danych zaszeregowany w formacie binarnym plus koszty poniesione przez serializacji.

  • ValidationMethodName
    Nazwa metoda sprawdzania poprawności wystąpienia UDT.

Ustawienie IsByteOrdered

Gdy Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered właściwość jest zestaw do true, są w efekcie gwarantujących, że serializowane dane binarne mogą służyć do semantyczne kolejność informacji.W związku z tym każde wystąpienie obiektu UDT zamówione bajt może mieć tylko jeden reprezentacja seryjnych.Kiedy wykonywana jest operacja porównania w SQL Server na szeregowany bajty jego wyniki powinna być taka sama, jak gdyby ta sama operacja porównania miał miejsce w kod zarządzany.Następujące funkcje są również obsługiwane, gdy IsByteOrdered jest zestaw do true:

  • Możliwość tworzenia indeksów kolumn tego typu.

  • Możliwość tworzenia kluczy podstawowych i kluczy obcych, jak również ograniczenia wyboru i unikatowe kolumn tego typu.

  • Możliwość korzystania z Transact-SQL ORDER BY, Grupuj według i PARTYCJI przez klauzul.W takich przypadkach reprezentacja binarna typu jest używana do określania kolejności.

  • Możliwość korzystania z operatorów porównania w Transact-SQL instrukcji.

  • Zdolność do utrwalania kolumny obliczane tego typu.

Należy zauważyć, że zarówno Native i UserDefined formatów szeregowania obsługuje następujące operatory porównania, gdy IsByteOrdered jest zestaw do true:

  • Równe (=)

  • Nie równa się (! =)

  • Większa (>)

  • Mniej niż (<)

  • Większa lub równa (>=)

  • Mniejsze lub równe (<=)

Implementowanie Nullability

Oprócz określenia atrybuty użytkownika zestawów poprawnie klasy musi obsługiwać opcje dopuszczania wartości null.Załadowane do UDTs SQL Server null obsługują, ale aby UDT rozpoznać wartości null, klasa musi implementować INullable interfejs.Aby uzyskać więcej informacji i przykład jak zaimplementować opcje dopuszczania wartości null w UDT, zobacz Kodowanie typów zdefiniowanych przez użytkownika.

Konwersji ciągów

Do obsługi ciąg konwersji do i z UDT, musisz podać Parse metoda i ToString metoda klasy użytkownikaParse Metoda umożliwia ciąg do przekonwertowania na UDT.Musi być zadeklarowany jako static (lub Shared w języku Visual Basic) i parametr typu System.Data.SqlTypes.SqlString.Więcej informacji i przykładowy sposób implementacji Parse i ToString metod, zobacz Kodowanie typów zdefiniowanych przez użytkownika.

Serializacji XML

UDTs musi obsługiwać konwersji do i z xml Typ danych przez odpowiadające kontrakt do serializacji XML.System.Xml.Serialization Nazw zawiera klasy, które są używane do serializować obiektów do dokumentów w formacie XML lub strumieni.Można zaimplementować xml serializacji przy użyciu IXmlSerializable interfejs, który zapewnia niestandardowego formatowania serializacji XML i deserializacji.

Oprócz wykonywania jawne konwersje z UDT do xml, serializacji XML umożliwia:

  • Użyj Xquery nad wartości wystąpień UDT po konwersji na xml typu danych.

  • UDTs w sparametryzowanych kwerend i z macierzystego usług XML sieci Web w sieci Web metody SQL Server.Aby uzyskać więcej informacji, zobacz Obsługa typu danych xml i typów zdefiniowanych przez użytkownika CLR.

  • Służy do otrzymywania UDTs ładowanie zbiorcze danych XML.

  • Serializować zestawów danych zawierających tabele z kolumnami UDT.

UDTs nie są szeregowane w XML dla kwerendy.wykonać kwerendy dla XML, która wyświetla serializacji XML UDTs, należy jawnie skonwertować każdej kolumna UDT do xml Typ danych w instrukcja SELECT.Można także jawnie przekonwertować kolumny, varbinary, varchar, lub nvarchar.