Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.INullableve třídě nebo struktuře vytvořením veřejnéstatic(Sharedv jazyce Visual Basic)Nullmetody. 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)Parsemetodu, která podporuje parsování, a veřejnou metoduToStringpro převod na řetězcovou reprezentaci objektu.UDT s uživatelsky definovaným formátem serializace musí implementovat
System.Data.IBinarySerializerozhraní a poskytnoutReadaWritemetodu.UDT musí implementovat
System.Xml.Serialization.IXmlSerializablenebo 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.IsByteOrderedmusí býttrue, aby bylo možné porovnávat data v pořadí bajtů. PokudIComparablerozhraní není implementováno aSqlUserDefinedTypeAttribute.IsByteOrderedjefalse, 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.MaxByteSizenastaveno 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.StructLayoutAttributemusí 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 UserDefinedmusíte v kódu provést následující akce:
Zadejte volitelnou vlastnost atributu
IsByteOrdered. Výchozí hodnota jefalse.Zadejte vlastnost
MaxByteSizeMicrosoft.SqlServer.Server.SqlUserDefinedTypeAttribute.Napište kód pro implementaci
ReadaWritemetod 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 UserDefinedv 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 18000nebo 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 MaxByteSizeje 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é
CHECKaUNIQUEomezení sloupců tohoto typu.Možnost používat klauzule Transact-SQL
ORDER BY,GROUP BYaPARTITION 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.