Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
A felhasználó által definiált típus (UDT) létrehozásakor számos fontos tervezési döntést kell meghoznia az SQL Serveren való telepítéshez. A legtöbb UDT esetében ajánlott az UDT struktúraként való létrehozása, bár az osztályként való létrehozása is lehetőség. Az UDT-definíciónak meg kell felelnie az UDT-k létrehozásának specifikációinak ahhoz, hogy regisztrálva legyen az SQL Serveren.
Az UDT-k implementálásának követelményei
Az SQL Serveren való futtatáshoz az UDT-nek az alábbi követelményeket kell megvalósítania az UDT-definícióban:
Az UDT-nek meg kell adnia a Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute. A System.SerializableAttribute használata nem kötelező, de ajánlott.
Az UDT-nek egy nyilvános
static(a Visual BasicbenShared)Nullmetódus létrehozásával kell implementálnia az osztály vagy a struktúraSystem.Data.SqlTypes.INullablefelületét. Az SQL Server alapértelmezés szerint nullérzékeny. Ez azért szükséges, hogy az UDT-ben futtatott kód felismerjen egy null értéket.Az UDT-nek tartalmaznia kell egy nyilvános
static(vagyShared)Parsemetódust, amely támogatja az elemzést, valamint egy nyilvánosToStringmetódust az objektum sztring-ábrázolására való konvertáláshoz.A felhasználó által definiált szerializálási formátummal rendelkező UDT-nek implementálnia kell a
System.Data.IBinarySerializefelületet, és meg kell adnia egyReadés egyWritemetódust.Az UDT-nek implementálnia kell
System.Xml.Serialization.IXmlSerializable, vagy az összes nyilvános mezőnek és tulajdonságnak XML-szerializálható vagyXmlIgnoreattribútummal ellátott típusúnak kell lennie, ha felül kell bírálni a szabványos szerializálást.Csak egy UDT-objektum szerializálása lehet. Az ellenőrzés sikertelen, ha a szerializálási vagy deszerializálási rutinok egy adott objektum több ábrázolását is felismerik.
SqlUserDefinedTypeAttribute.IsByteOrderedtruekell lennie az adatok bájtsorrendben való összehasonlításához. Ha aIComparablefelület nincs implementálva, ésSqlUserDefinedTypeAttribute.IsByteOrderedfalse, a bájtsorrendek összehasonlítása sikertelen.Az osztályban definiált UDT-nek olyan nyilvános konstruktorsal kell rendelkeznie, amely nem vesz fel argumentumokat. Igény szerint több túlterhelt osztálykonstruktort is létrehozhat.
Az UDT-nek nyilvános mezőként vagy tulajdonságeljárásként kell elérhetővé tennie az adatelemeket.
A nyilvános nevek nem lehetnek hosszabbak 128 karakternél, és meg kell felelniük a adatbázis-azonosítókmeghatározott azonosítók SQL Server-elnevezési szabályainak.
sql_variant oszlopok nem tartalmazhatnak UDT-példányokat.
Az örökölt tagok nem érhetők el Transact-SQL, mert az SQL Server-típusrendszer nem ismeri az UDT-k öröklési hierarchiáját. Az osztályok strukturálásakor azonban használhat öröklést, és az ilyen metódusokat meghívhatja a típus felügyelt kód implementációjában.
A tagok nem terhelhetők túl, kivéve az osztálykonstruktort. Ha túlterhelt metódust hoz létre, a rendszer nem okoz hibát a szerelvény regisztrálásakor vagy a típus SQL Serverben való létrehozásakor. A túlterhelt metódus észlelése futásidőben történik, nem a típus létrehozásakor. A túlterhelt metódusok mindaddig létezhetnek az osztályban, amíg soha nem hívják meg őket. A túlterhelt metódus meghívása után hiba jelenik meg.
Minden
static(vagyShared) tagot állandóként vagy írásvédettként kell deklarálni. A statikus tagok nem lehetnek módosíthatók.Ha a
SqlUserDefinedTypeAttribute.MaxByteSizemező-1értékre van állítva, a szerializált UDT mérete akkora lehet, mint a nagy objektum (LOB) méretkorlátja (jelenleg 2 GB). Az UDT mérete nem haladhatja meg aMaxByteSizedmezőben megadott értéket.
Jegyzet
Bár a kiszolgáló nem használja összehasonlításokhoz, igény szerint implementálhatja a System.IComparable felületet, amely egyetlen metódust tesz elérhetővé, CompareTo. Ezt az ügyféloldalon használják olyan helyzetekben, amikor az UDT-értékek pontos összehasonlítása vagy sorrendje kívánatos.
Natív szerializálás
Az UDT megfelelő szerializálási attribútumainak kiválasztása a létrehozni kívánt UDT típusától függ. A Native szerializálási formátum egy egyszerű struktúrát használ, amely lehetővé teszi, hogy az SQL Server az UDT hatékony natív ábrázolását tárolja a lemezen. A Native formátum akkor ajánlott, ha az UDT egyszerű, és csak a következő típusú mezőket tartalmazza:
Az ilyen típusú mezőkből álló értéktípusok jó jelöltek Native formátumra, például struct C#-ban, vagy Structure a Visual Basic .NET-ben ismert módon. A Native szerializálási formátummal megadott UDT például tartalmazhat egy másik UDT-mezőt, amely szintén a Native formátummal lett megadva. Ha az UDT-definíció összetettebb, és az előző listában nem szereplő adattípusokat tartalmaz, a UserDefined szerializálási formátumot kell megadnia.
A Native formátumra a következő követelmények vonatkoznak:
A típus nem adhat meg értéket
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize.Minden mezőnek szerializálhatónak kell lennie.
A
System.Runtime.InteropServices.StructLayoutAttributeStructLayout.LayoutKindSequentialkell megadni, ha az UDT egy osztályban van definiálva, és nem struktúrában. Ez az attribútum szabályozza az adatmezők fizikai elrendezését, és arra szolgál, hogy a tagokat a megjelenésük sorrendjében határozzák meg. Az SQL Server ezzel az attribútummal határozza meg a több értékkel rendelkező UDT-k mezősorrendét.
Példa a Native szerializálással definiált UDT-ra, lásd a Point UDT-t Felhasználó által definiált típusok létrehozása ADO.NET.
UserDefined szerializálás
A Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute attribútum UserDefined formátumbeállítása teljes körű ellenőrzést biztosít a fejlesztő számára a bináris formátum felett. A Format attribútumtulajdonság UserDefinedként való megadásakor a következő műveleteket kell végrehajtania a kódban:
Adja meg a választható
IsByteOrderedattribútumtulajdonságot. Az alapértelmezett érték afalse.Adja meg a
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttributeMaxByteSizetulajdonságát.A
System.Data.Sql.IBinarySerializefelület implementálásával kódot írhat az UDTReadésWritemetódusainak implementálásához.
Példa a UserDefined szerializálással definiált UDT-ra: Felhasználó által definiált típusok létrehozása ADO.NET.
Jegyzet
Az UDT-mezőknek natív szerializálást kell használniuk, vagy meg kell őrizni őket az indexeléshez.
Szerializálási attribútumok
Az attribútumok határozzák meg, hogyan történik a szerializálás az UDT-k tárolási ábrázolásának létrehozásához és az UDT-k érték szerinti továbbításához az ügyfélnek. Az UDT létrehozásakor meg kell adnia a Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute. A Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute attribútum azt jelzi, hogy az osztály egy UDT, és megadja az UDT tárterületét. Igény szerint megadhatja a Serializable attribútumot, bár az SQL Serverhez nincs szükség erre.
A Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute a következő tulajdonságokkal rendelkezik.
Formátum
Megadja a szerializálási formátumot, amely az UDT adattípusától függően Native vagy UserDefinedlehet.
IsByteOrdered
Egy Boolean érték, amely meghatározza, hogy az SQL Server hogyan hajtja végre a bináris összehasonlításokat az UDT-n.
IsFixedLength
Azt jelzi, hogy az UDT összes példánya azonos hosszúságú-e.
MaxByteSize
A példány maximális mérete bájtban. Meg kell adnia MaxByteSize a UserDefined szerializálási formátumot. Felhasználó által definiált szerializálást tartalmazó UDT esetén MaxByteSize a felhasználó által meghatározott szerializált formában az UDT teljes méretére hivatkozik. A MaxByteSize értékének a 80001 tartományában kell lennie, vagy -1 értékre kell állítania, hogy jelezze, hogy az UDT nagyobb, mint 8000 bájt (a teljes méret nem haladhatja meg a maximális LOB-méretet). Fontolja meg a 10 karakterből álló sztring (System.Char) tulajdonságú UDT-t. Ha az UDT bináris íróval szerializálva van, a szerializált sztring teljes mérete 22 bájt: Unicode UTF-16 karakterenként 2 bájt, megszorozva a karakterek maximális számával, valamint 2 vezérlőbájt a bináris adatfolyam szerializálásával járó többletterheléssel. Ezért a MaxByteSizeértékének meghatározásakor figyelembe kell venni a szerializált UDT teljes méretét: a bináris formában szerializált adatok méretét és a szerializálással járó többletterhelést.
ValidationMethodName
Az UDT példányainak ellenőrzésére használt metódus neve.
Az isbyteordered beállítása
Ha a Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered tulajdonság trueértékre van állítva, akkor garantálja, hogy a szerializált bináris adatok felhasználhatók az információk szemantikai sorrendbe helyezéséhez. Így egy bájtsorrendű UDT-objektum minden példánya csak egy szerializált ábrázolással rendelkezhet. Ha az SQL Serveren szerializált bájtokon végez összehasonlítási műveletet, az eredménynek meg kell egyeznie, mintha ugyanaz az összehasonlítási művelet történt volna a felügyelt kódban. Az alábbi funkciók akkor is támogatottak, ha IsByteOrderedtruevan beállítva:
Az ilyen típusú oszlopok indexeinek létrehozása.
Az elsődleges és idegen kulcsok, valamint az ilyen típusú oszlopokra vonatkozó
CHECKésUNIQUEkorlátozások létrehozásának lehetősége.A Transact-SQL
ORDER BY,GROUP BYésPARTITION BYzáradékok használata. Ezekben az esetekben a típus bináris ábrázolása határozza meg a sorrendet.Az összehasonlító operátorok használata Transact-SQL utasításokban.
Az ilyen típusú számított oszlopok megőrzése.
A Native és UserDefined szerializálási formátumok a következő összehasonlító operátorokat támogatják, ha IsByteOrderedtruevan beállítva:
- Egyenlő (
=) - Nem egyenlő (
!=) - Nagyobb, mint (
>) - Kisebb, mint (
<) - Nagyobb vagy egyenlő (
>=) - Kisebb vagy egyenlő (
<=)
Nullability implementálása
A szerelvények attribútumainak helyes megadása mellett az osztálynak támogatnia kell a null értékűséget is. Az SQL Serverbe betöltött UDT-k nullérzékenyek, de ahhoz, hogy az UDT felismerjen egy null értéket, az osztálynak implementálnia kell a INullable felületet. További információkért és a nullitás UDT-ben való implementálásának példájáért lásd: Felhasználó által definiált típusok létrehozása ADO.NET.
Sztringkonvertálások
Az UDT-be való és azokból való sztringátalakítás támogatásához meg kell adnia egy Parse metódust és egy ToString metódust az osztályban. A Parse metódus lehetővé teszi, hogy a sztringek UDT-vé alakuljanak. Deklarálni kell static (vagy a Visual Basicben Shared), és egy System.Data.SqlTypes.SqlStringtípusú paramétert kell megadnia. További információkért és a Parse és ToString metódusok implementálásához lásd: Felhasználó által definiált típusok létrehozása ADO.NET.
XML-szerializálás
Az UDT-knek támogatniuk kell a xml adattípusra való konvertálást az XML-szerializálásra vonatkozó szerződésnek megfelelően. A System.Xml.Serialization névtér olyan osztályokat tartalmaz, amelyek az objektumok XML formátumú dokumentumokká vagy streamekké való szerializálására szolgálnak. A IXmlSerializable felülettel xml- szerializálás implementálható, amely egyéni formázást biztosít az XML-szerializáláshoz és deszerializáláshoz.
Az XML-szerializálás az UDT-ről xml-való explicit átalakításon kívül a következőket teszi lehetővé:
Az XQuery használata az UDT-példányok értékein a xml adattípusra való átalakítás után.
Használjon UDT-ket paraméteres lekérdezésekben és webes metódusokban natív XML Web Services használatával az SQL Serverben.
Az UDT-k használatával tömegesen fogadhatja az XML-adatokat.
Szerializálja az UDT-oszlopokkal rendelkező táblákat tartalmazó adathalmazokat.
Az UDT-k nincsenek szerializálva XML-lekérdezésekben. Az UDT-k XML-szerializálását megjelenítő XML-lekérdezés végrehajtásához az egyes UDT-oszlopokat explicit módon konvertálja az SELECT utasításban szereplő xml adattípusra. Az oszlopokat explicit módon átalakíthatja varbináris, varchar, vagy nvarchar.