Požadavky na uživatelem definovaný typ (UDT)
platí pro:SQL Server
Při vytváření uživatelem definovaného typu (UDT) pro instalaci na SQL Serveru musíte provést několik důležitých rozhodnutí o návrhu. U většiny UDT se doporučuje vytvořit UDT jako strukturu, i když vytvoření jako třídy je také možností. Definice UDT musí odpovídat specifikacím pro vytváření UDT, aby byla zaregistrována u SQL Serveru.
Požadavky na implementaci UDT
Pokud chcete spustit na SQL Serveru, musí UDT implementovat následující požadavky v definici UDT:
UDT musí zadat Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
. Použití System.SerializableAttribute
je volitelné, ale doporučuje se.
UDT musí implementovat rozhraní
System.Data.SqlTypes.INullable
ve třídě nebo struktuře vytvořením veřejnéstatic
(Shared
v jazyce Visual Basic)Null
metody. SQL Server ve výchozím nastavení používá hodnotu null. To je nezbytné pro kód spuštěný v UDT, aby bylo možné rozpoznat hodnotu null.UDT musí obsahovat veřejnou
static
(neboShared
)Parse
metodu, která podporuje parsování, a veřejnou metoduToString
pro převod na řetězcovou reprezentaci objektu.UDT s uživatelsky definovaným formátem serializace musí implementovat
System.Data.IBinarySerialize
rozhraní a poskytnoutRead
aWrite
metodu.UDT musí implementovat
System.Xml.Serialization.IXmlSerializable
nebo všechna veřejná pole a vlastnosti musí být typu, které jsou XML serializovatelné nebo zdobené atributemXmlIgnore
, pokud je vyžadována přepsání standardní serializace.Musí existovat pouze jedna serializace objektu UDT. Ověření selže, pokud serializace nebo deserializace rutin rozpozná více než jedno vyjádření konkrétního objektu.
SqlUserDefinedTypeAttribute.IsByteOrdered
musí býttrue
, aby bylo možné porovnávat data v pořadí bajtů. PokudIComparable
rozhraní není implementováno aSqlUserDefinedTypeAttribute.IsByteOrdered
jefalse
, porovnání pořadí bajtů selže.UDT definovaný ve třídě musí mít veřejný konstruktor, který nepřijímá žádné argumenty. Volitelně můžete vytvořit více přetížených konstruktorů tříd.
UDT musí vystavit datové prvky jako veřejná pole nebo procedury vlastností.
Veřejné názvy nesmí být delší než 128 znaků a musí odpovídat pravidlům pojmenování SYSTÉMU SQL Server pro identifikátory definované v identifikátorech Databáze.
sql_variant sloupce nemůžou obsahovat instance UDT.
Zděděné členy nejsou přístupné z Transact-SQL, protože systém typů SQL Serveru nezná hierarchii dědičnosti mezi UDT. Dědičnost však můžete použít při strukturování tříd a můžete takové metody volat ve spravované implementaci kódu typu.
Členy nelze přetížit, s výjimkou konstruktoru třídy. Pokud vytvoříte přetíženou metodu, při registraci sestavení nebo vytvoření typu v SQL Serveru se nevyvolá žádná chyba. Detekce přetížené metody probíhá za běhu, ne při vytvoření typu. Přetížené metody mohou existovat ve třídě, pokud se nikdy nevyvolají. Jakmile vyvoláte přetíženou metodu, vyvolá se chyba.
Všechny členy
static
(neboShared
) musí být deklarovány jako konstanty nebo jen pro čtení. Statické členy nelze měnit.Pokud je pole
SqlUserDefinedTypeAttribute.MaxByteSize
nastaveno na-1
, serializovaný UDT může být tak velký jako limit velikosti velkého objektu (LOB) (aktuálně 2 GB). Velikost UDT nemůže překročit hodnotu zadanou v poliMaxByteSized
.
Poznámka
I když server nepoužívá k provádění porovnání, můžete volitelně implementovat System.IComparable
rozhraní, které zveřejňuje jednu metodu CompareTo
. Používá se na straně klienta v situacích, kdy je žádoucí přesně porovnat nebo uspořádat hodnoty UDT.
Nativní serializace
Volba správných atributů serializace pro UDT závisí na typu UDT, který se pokoušíte vytvořit. Formát serializace Native
využívá jednoduchou strukturu, která sql Serveru umožňuje ukládat efektivní nativní reprezentaci UDT na disku. Formát Native
se doporučuje, pokud je UDT jednoduchý a obsahuje pouze pole následujících typů:
Typy hodnot, které se skládají z polí těchto typů, jsou vhodnými kandidáty pro Native
formát, například struct
v jazyce C# nebo Structure
, protože jsou známé v jazyce Visual Basic .NET. Například UDT zadaný s formátem serializace Native
může obsahovat pole jiného UDT, které bylo zadáno také ve formátu Native
. Pokud je definice UDT složitější a obsahuje datové typy, které nejsou v předchozím seznamu, musíte místo toho zadat UserDefined
formát serializace.
Formát Native
má následující požadavky:
Typ nesmí zadávat hodnotu pro
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize
.Všechna pole musí být serializovatelná.
System.Runtime.InteropServices.StructLayoutAttribute
musí být zadán jakoStructLayout.LayoutKindSequential
, pokud je UDT definována ve třídě, nikoli ve struktuře. Tento atribut řídí fyzické rozložení datových polí a slouží k vynucení rozložení členů v pořadí, ve kterém se zobrazují. SQL Server používá tento atribut k určení pořadí polí u UDT s více hodnotami.
Příklad UDT definovaného pomocí serializace Native
najdete v Point
UDT v Vytváření uživatelsky definovaných typů pomocí ADO.NET.
Serializace definovaná uživatelem
Nastavení formátu UserDefined
atributu Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
dává vývojáři úplnou kontrolu nad binárním formátem. Při zadávání vlastnosti atributu Format
jako UserDefined
musíte v kódu provést následující akce:
Zadejte volitelnou vlastnost atributu
IsByteOrdered
. Výchozí hodnota jefalse
.Zadejte vlastnost
MaxByteSize
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
.Napište kód pro implementaci
Read
aWrite
metod pro UDT implementací rozhraníSystem.Data.Sql.IBinarySerialize
.
Příklad UDT definovaného pomocí serializace UserDefined
naleznete v UDT měny v Vytvoření uživatelsky definovaných typů pomocí ADO.NET.
Poznámka
Pole UDT musí používat nativní serializaci nebo musí být zachována, aby bylo možné indexovat.
Atributy serializace
Atributy určují, jak se serializace používá k vytvoření reprezentace úložiště UDT a k přenosu UDT hodnotou klientovi. Při vytváření UDT musíte zadat Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
. Atribut Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
označuje, že třída je UDT a určuje úložiště pro UDT. Volitelně můžete zadat atribut Serializable
, i když SQL Server to nevyžaduje.
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
má následující vlastnosti.
Formát
Určuje formát serializace, který může být Native
nebo UserDefined
v závislosti na datových typech UDT.
IsByteOrdered
Hodnota Boolean
, která určuje, jak SQL Server provádí binární porovnání u UDT.
IsFixedLength
Určuje, jestli mají všechny instance tohoto UDT stejnou délku.
MaxByteSize
Maximální velikost instance vbajchch Je nutné zadat MaxByteSize
ve formátu serializace UserDefined
. UDT se zadaným uživatelem definovaným serializací MaxByteSize
odkazuje na celkovou velikost UDT v serializované podobě definované uživatelem. Hodnota MaxByteSize
musí být v rozsahu 1
8000
nebo nastavená na -1
, aby bylo možné určit, že UDT je větší než 8 000 bajtů (celková velikost nesmí překročit maximální velikost obchodního objektu). Zvažte UDT s vlastností řetězce 10 znaků (System.Char
). Pokud je UDT serializován pomocí BinaryWriter, celková velikost serializovaného řetězce je 22 bajtů: 2 bajty na Unicode UTF-16 znak, vynásobený maximálním počtem znaků, plus 2 řídicí bajty režie vzniklé serializací binárního streamu. Proto při určování hodnoty MaxByteSize
je třeba zvážit celkovou velikost serializovaného UDT: velikost dat serializovaných v binární podobě a režijní náklady vzniklé serializací.
ValidationMethodName
Název metody použité k ověření instancí UDT.
Nastavit isbyteordered
Pokud je vlastnost Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered
nastavena na true
, zaručujete, že serializovaná binární data lze použít pro sémantické řazení informací. Každá instance objektu UDT seřazeného bajtu tedy může mít pouze jednu serializovanou reprezentaci. Při operaci porovnání v SQL Serveru na serializovaných bajtech by jeho výsledky měly být stejné jako v případě, že stejná operace porovnání proběhla ve spravovaném kódu. Pokud je IsByteOrdered
nastavená na true
, podporují se také následující funkce:
Možnost vytvářet indexy pro sloupce tohoto typu.
Možnost vytvářet primární a cizí klíče a také
CHECK
aUNIQUE
omezení sloupců tohoto typu.Možnost používat klauzule Transact-SQL
ORDER BY
,GROUP BY
aPARTITION BY
. V těchto případech se binární reprezentace typu používá k určení pořadí.Možnost používat relační operátory v příkazech Transact-SQL.
Schopnost uchovávat počítané sloupce tohoto typu.
Formáty serializace Native
i UserDefined
podporují následující relační operátory, pokud je IsByteOrdered
nastavena na true
:
- Rovná se (
=
) - Nerovná se (
!=
) - Větší než (
>
) - Menší než (
<
) - Větší než nebo rovno (
>=
) - Menší než nebo rovno (
<=
)
Implementace možnosti null
Kromě správné zadávání atributů pro sestavení musí třída také podporovat nullability. UDT načtené do SQL Serveru mají hodnotu null, ale aby UDT rozpoznal hodnotu null, třída musí implementovat rozhraní INullable
. Další informace a příklad implementace nullability v UDT najdete v tématu Vytvoření uživatelem definovaných typů pomocí ADO.NET.
Převody řetězců
Chcete-li podporovat převod řetězců do a z UDT, je nutné zadat Parse
metodu a ToString
metodu ve vaší třídě. Metoda Parse
umožňuje převod řetězce na UDT. Musí být deklarován jako static
(nebo Shared
v jazyce Visual Basic) a vzít parametr typu System.Data.SqlTypes.SqlString
. Další informace a příklad implementace metod Parse
a ToString
naleznete v tématu Vytvoření uživatelem definovaných typů pomocí ADO.NET.
Serializace XML
UDT musí podporovat převod do a z xml datového typu tím, že odpovídá kontraktu pro serializaci XML.
System.Xml.Serialization
obor názvů obsahuje třídy, které se používají k serializaci objektů do dokumentů nebo datových proudů formátu XML. Můžete se rozhodnout implementovat xml serializace pomocí IXmlSerializable
rozhraní, které poskytuje vlastní formátování pro serializaci a deserializaci XML.
Kromě provádění explicitních převodů z UDT na xml, serializace XML umožňuje:
Po převodu na xml datový typ použijte XQuery u hodnot instancí UDT.
UDT se používají v parametrizovaných dotazech a webových metodách s nativními webovými službami XML na SQL Serveru.
Pomocí UDT můžete přijímat hromadné načítání dat XML.
Serializace datových sad obsahujících tabulky se sloupci UDT
UDT nejsou serializovány v dotazech FOR XML. Pokud chcete spustit dotaz FOR XML, který zobrazuje serializaci UDT, explicitně převeďte každý sloupec UDT na xml datový typ v příkazu SELECT
. Sloupce můžete také explicitně převést na varbinární, varcharnebo nvarchar.