Sdílet prostřednictvím


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 (nebo Shared) Parse metodu, která podporuje parsování, a veřejnou metodu ToString pro převod na řetězcovou reprezentaci objektu.

  • UDT s uživatelsky definovaným formátem serializace musí implementovat System.Data.IBinarySerialize rozhraní a poskytnout Read a Write metodu.

  • UDT musí implementovat System.Xml.Serialization.IXmlSerializablenebo všechna veřejná pole a vlastnosti musí být typu, které jsou XML serializovatelné nebo zdobené atributem XmlIgnore, 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ýt true, aby bylo možné porovnávat data v pořadí bajtů. Pokud IComparable rozhraní není implementováno a SqlUserDefinedTypeAttribute.IsByteOrdered je false, 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 (nebo Shared) 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 poli MaxByteSized.

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ů:

, bajtové, , krátké, , , dlouhé, , plovoucí, , , , , , , , , ,

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

  • Zadejte vlastnost MaxByteSizeMicrosoft.SqlServer.Server.SqlUserDefinedTypeAttribute.

  • Napište kód pro implementaci Read a Write 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 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é CHECK a UNIQUE omezení sloupců tohoto typu.

  • Možnost používat klauzule Transact-SQL ORDER BY, GROUP BYa PARTITION 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.