Wymagania dotyczące 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 zaleca się, mimo że tworzenie go jako klasa jest również opcja.Definicja UDT muszą być zgodne z specyfikacje tworzenia UDTs ono być zarejestrowana SQL Server.
Wymagania dotyczące Implementowanie UDTs
Aby uruchomić w SQL Server, Twój UDT musi implementować następujące wymagania w definicji UDT:
Należy określić UDT Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute. Korzystanie z System.SerializableAttribute jest opcjonalne, jednak 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, aby kod wykonywany w UDT, aby można było rozpoznać wartości null.
UDT musi zawierać publiczny static (lub Shared) Parse Metoda, która obsługuje analizy z i publiczny ToString Metoda konwersji na ciąg znaków reprezentujący obiektu.
UDT z formatem serializacji zdefiniowanej przez użytkownika musi implementować System.Data.IBinarySerialize interfejs i zapewniają Read i Write Metoda.
UDT musi implementować System.Xml.Serialization.IXmlSerializable, lub wszystkie pola publicznego i właściwości musi być typów, które są XML możliwy do serializacji lub dekoracyjną z XmlIgnore atrybut, jeśli przesłanianie serializacji standardowych jest wymagany.
Musi istnieć tylko jeden serializacji obiektu UDT.Sprawdzanie poprawności kończy się niepowodzeniem, jeśli serialize lub deserializacji procedur rozpoznaje więcej niż jeden reprezentacja danego obiektu.
SqlUserDefinedTypeAttribute.IsByteOrdered musi być true w celu zapewnienia, że serwer używa zamówione bajt porównania wartości UDT.
UDT, zdefiniowana w klasie musi mieć publicznego konstruktora bez argumentów trwa.Opcjonalnie można tworzyć dodatkowe klasy przeciążone konstruktorów.
UDT musi ujawniać elementy danych jako publiczne pola lub właściwość procedur.
Publiczne nazwy nie może być dłuższa niż 128 znaków i musi być zgodna z SQL Server Zasady nazywania dla identyfikatorów, zgodnie z definicją w Identyfikatory.
sql_variant kolumny nie może zawierać wystąpienia UDT.
Nie są dostępne z dziedziczonych członków Transact-SQL ponieważ SQL Server system typów nie otrzymała hierarchii dziedziczenia wśród UDTs. Jednak dziedziczenie można użyć po struktury sieci klasy i metody takie może wywołać w celu wykonania kod zarządzany typu.
Członkowie nie mogą być przeciążone, z wyjątkiem dla konstruktora klasy.Jeśli należy tworzyć metodą przeciążony, błąd nie jest wywoływane, gdy można zarejestrować wirtualny plik dziennika lub utworzyć typ w SQL Server. Wykrywanie przeciążone metoda występuje w czasie wykonywania, nie po utworzeniu typu.Metody przeciążone może istnieć w klasie tak długo, jak nigdy nie są one wywoływane.Gdy wywołanie metoda przeciążony, błąd zostanie zaokrąglona.
Wszystkie static (lub Shared) elementy członkowskie muszą być zadeklarowana jako stałe czy tylko do odczytu. Elementy statyczne nie mogą być mutable.
Zaczyna się od SQL Server 2008, jeśli SqlUserDefinedTypeAttribute.MaxByteSize pole jest ustawione na wartość -1, serializowane UDT może być tak duży, jak maksymalny rozmiar dużego obiektu (LOB) (aktualnie 2 GB). Rozmiar UDT nie może przekraczać wartości określonej w polu MaxByteSized pole.
Uwaga
Mimo to nie jest używany przez serwer do przeprowadzania porównań, opcjonalnie można zaimplementować System.IComparable interfejs, który udostępnia jedną metoda, CompareTo. Używany w sytuacji, w których jest pożądane w celu dokładnego porównania lub kolejność wartości UDT po stronie klient.
Serializacji macierzystego
Wybieranie atrybutów prawym serializacji dla swojego UDT zależy od typu UDT chcesz utworzyć.The Native serialization format utilizes a very simple structure that enables SQL Server to store an efficient native representation of the UDT on disk.The Native format is recommended if the UDT is simple and only contains fields of the following types:
wartość logiczna, bajt, sbyte, krótkie, USHORT, int, uint, długie, ulong, zmiennoprzecinkowe, podwójne, SqlByte, SqlInt16, SqlInt32, SqlInt64, SqlDateTime, SqlSingle, SqlDouble, SqlMoney, SqlBoolean
Typy wartości, które składają się z pól z opisanych typów są dobrym kandydatami do Native formatowanie, takie jak structs w środowisku Visual C# (lub Structures jak są one znane w języku Visual Basic). Na przykład, za pomocą określić UDT Native format serializacji może zawierać pole z innej UDT również określona z Native Format. Jeśli definicja UDT jest bardziej złożone i zawiera typy danych nie ma na powyższej liście, należy określić UserDefined Szeregowanie formatu zamiast niego.
The Native format has the following requirements:
Typ nie należy określić wartość w polu Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize.
Wszystkie pola muszą być możliwy do serializacji.
The System.Runtime.InteropServices.StructLayoutAttribute must be specified as StructLayout.LayoutKindSequential if the UDT is defined in a class and not a structure.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.
Aby zapoznać się z UDT, zdefiniowane przy użyciu Native Szeregowanie, zobacz temat UDT punkt w Kodowanie Typy definiowane przez użytkownika.
Serializacji zdefiniowany
The UserDefined format setting for the Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute atrybut gives the developer full control over the binary format. Podczas określania Format właściwość atrybut jako UserDefined, w kodzie należy wykonać następujące czynności:
Określa opcjonalny IsByteOrdered Właściwość atrybut. Wartością domyślną jest false.
Określ MaxByteSize Właściwość Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.
Pisanie kodu do wykonania Read i Write metody UDT implementując System.Data.Sql.IBinarySerialize interfejs.
Aby zapoznać się z UDT, zdefiniowane przy użyciu UserDefined Szeregowanie, zobacz temat UDT waluty w Kodowanie Typy definiowane przez użytkownika.
Uwaga
Począwszy od SQL Server 2005 Wersja RTM, UDTs CLR z serializacji zdefiniowanej przez użytkownika zostały może mieć ich pola indeksowane jako część kolumny obliczane nie są zachowywane lub widoków. W takich sytuacjach-deterministyczny UDT serializacji/deserializacji może spowodować uszkodzenie indeksu, a w związku z tym zostaną usunięte z SQL Server 2005 Z DODATKIEM SP1. W SQL Server 2005 W przypadku dodatku SP1 UDT pól muszą używać macierzystych serializacji lub być utrwalone mają być indeksowane. Wszelkie istniejące indeksy dla pól UDT należy nadal działać jak poprzednio.
Szeregowanie atrybuty
Atrybuty określają, jak serializacji jest używana do konstruowania reprezentacja magazynowania UDTs i przekazywanie UDTs przez wartość do klient.Musisz określić Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute Podczas tworzenia UDT. The Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute atrybut indicates that the class is a UDT and specifies the storage for the UDT. Można opcjonalnie określić Serializable atrybut, mimo że SQL Server nie wymaga to.
The Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute has the following properties.
Format
Określa format serializacji, które mogą 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 porównanie binarne UDT.IsFixedLength
Wskazuje, czy wszystkie wystąpienia tego UDT mają taką samą długość.MaxByteSize
Maksymalny rozmiar obiektu, w bajtach.Należy określić MaxByteSize z UserDefined format serializacji. Dla UDT z serializacji zdefiniowanej przez użytkownika 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 wskazuje, że UDT jest większy niż 8000 bajtów (całkowity rozmiar nie może przekroczyć maksymalny rozmiar obiektu LOB). Należy wziąć pod uwagę UDT z właściwością w 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 oraz kontroli 2 bajtów koszty poniesione w związku z szeregowania strumień binarny. Dlatego podczas określania wartości MaxByteSize, należy rozważyć całkowity rozmiar UDT szeregowane: rozmiar danych seryjnych w postaci binarnej plus obciążenia poniesione przez serializacji.ValidationMethodName
Nazwa metoda sprawdzania poprawności wystąpienia UDT.
Ustawianie IsByteOrdered
Gdy Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered Właściwość jest zestaw do true, są w efekcie gwarantujące, że serializowane dane binarne mogą służyć do semantyki kolejność informacji. W ten sposób każde wystąpienie obiektu UDT zamówione bajt może mieć tylko jeden reprezentacja szeregowany.Gdy operacja porównania jest wykonywane w SQL Server na serializowane bajty jego wyniki powinna być taka sama jak gdyby ta sama operacja porównania miał 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 ograniczenia wyboru i unikatowa w kolumnach tego typu.
Możliwość korzystania z Transact-SQL Klauzule ORDER BY, GROUP BY, a PARTITION BY. W takich przypadkach reprezentacja binarna tego typu jest używana do określania kolejności.
Możliwość korzystania z operatorów porównania w Transact-SQL instrukcje.
Zdolność do kolumny obliczane tego typu będą się powtarzać.
Należy zauważyć, że zarówno Native i UserDefined formatów szeregowania obsługuje następujące operatory porównania po IsByteOrdered jest zestaw do true:
Równa (=)
Nie równa się (! =)
Większe niż)>)
Mniejszy niż)<)
Większe lub równe)>=)
Mniejsze lub równe)<=)
Wykonania opcje dopuszczania wartości null
Oprócz określenia atrybutów z zestawów poprawnie, klasy musi obsługiwać opcje dopuszczania wartości null.UDTs ładowane do SQL Server wartość zerowa obsługują, ale aby UDT rozpoznawał wartości null, musi implementować klasę INullable interfejs. Aby uzyskać więcej informacji i przykład jak zaimplementować opcje dopuszczania wartości null w UDT zobacz Kodowanie Typy definiowane przez użytkownika.
Ciąg Conversions
Aby zapewnić obsługę konwersji ciąg do i z UDT, musisz podać Parse Metoda oraz ToString Metoda w klasie. The Parse metoda allows a ciąg to be converted into a UDT. To musi być zadeklarowany jako static (lub Shared w języku Visual Basic) oraz parametr typu System.Data.SqlTypes.SqlString. Aby uzyskać więcej informacji i przykładowy sposób implementacji Parse i ToString metody, zobacz Kodowanie Typy definiowane przez użytkownika.
Serializacji XML
UDTs musi obsługiwać konwersji do i z xml Typ danych przez zgodnych z kontrakt do serializacji XML. The System.Xml.Serialization namespace contains classes that are used to serialize objects into XML format documents or streams.Istnieje możliwość wdrożenia xml Szeregowanie przy użyciu IXmlSerializable interfejs, który zapewnia formatowania niestandardowego serializacji XML i deserializacji.
Oprócz wykonywania jawne konwersje z UDT do xmlSerializacji XML można:
Użycie Xquery za pośrednictwem wartości wystąpień UDT po konwersji na xml Typ danych.
Użyj UDTs kwerend parametrycznych i metod macierzysty usług XML sieci Web w sieci Web SQL Server. Aby uzyskać więcej informacji zobaczObsługa typu danych xml i typy zdefiniowane przez użytkownika CLR.
Za pomocą UDTs odbierać ładowanie zbiorcze danych XML.
Serializować zestawach danych, które zawierają tabele z kolumnami UDT.
UDTs nie są szeregowane FOR XML kwerendy.Aby wykonać kwerendę FOR XML, która wyświetla serializacji XML UDTs, jawnie przekonwertować każdej kolumna UDT do xml Typ danych w instrukcja SELECT. Można także jawnie przekonwertować kolumny varbinary, varchar, lub nvarchar.