Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Du måste fatta flera viktiga designbeslut när du skapar en användardefinierad typ (UDT) som ska installeras i SQL Server. För de flesta UDT rekommenderas att du skapar UDT som en struktur, även om det också är ett alternativ att skapa det som en klass. UDT-definitionen måste överensstämma med specifikationerna för att skapa UDT för att den ska kunna registreras med SQL Server.
Krav för att implementera UDT
Om du vill köra i SQL Server måste UDT implementera följande krav i UDT-definitionen:
UDT måste ange Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
. Användningen av System.SerializableAttribute
är valfri, men rekommenderas.
UDT måste implementera
System.Data.SqlTypes.INullable
-gränssnittet i klassen eller strukturen genom att skapa en offentligstatic
(Shared
i Visual Basic)Null
-metoden. SQL Server är null-medveten som standard. Detta är nödvändigt för att kodkörning i UDT ska kunna identifiera ett null-värde.UDT måste innehålla en offentlig
static
(ellerShared
)Parse
metod som stöder parsning från och en offentligToString
-metod för konvertering till en strängrepresentation av objektet.En UDT med ett användardefinierat serialiseringsformat måste implementera
System.Data.IBinarySerialize
-gränssnittet och tillhandahålla enRead
och enWrite
-metod.UDT måste implementera
System.Xml.Serialization.IXmlSerializable
, eller så måste alla offentliga fält och egenskaper vara av typer som är XML-serialiserbara eller dekorerade med attributetXmlIgnore
om åsidosättande standard serialisering krävs.Det får bara finnas en serialisering av ett UDT-objekt. Verifieringen misslyckas om serialisera eller deserialisera rutiner känner igen mer än en representation av ett visst objekt.
SqlUserDefinedTypeAttribute.IsByteOrdered
måste varatrue
för att kunna jämföra data i byteordning. OmIComparable
-gränssnittet inte implementeras ochSqlUserDefinedTypeAttribute.IsByteOrdered
ärfalse
misslyckas byteordningsjämförelserna.En UDT som definieras i en klass måste ha en offentlig konstruktor som inte tar några argument. Du kan också skapa fler överlagrade klasskonstruktorer.
UDT måste exponera dataelement som offentliga fält eller egenskapsprocedurer.
Offentliga namn får inte vara längre än 128 tecken och måste överensstämma med SQL Server-namngivningsreglerna för identifierare enligt definitionen i Database-identifierare.
sql_variant kolumner får inte innehålla instanser av en UDT.
Ärvda medlemmar är inte tillgängliga från Transact-SQL eftersom SQL Server-typsystemet inte känner till arvshierarkin bland UDT:er. Du kan dock använda arv när du strukturerar dina klasser och du kan anropa sådana metoder i den hanterade kodimplementeringen av typen.
Medlemmar kan inte överbelastas, förutom klasskonstruktorn. Om du skapar en överbelastad metod utlöses inget fel när du registrerar sammansättningen eller skapar typen i SQL Server. Identifiering av den överlagrade metoden sker vid körning, inte när typen skapas. Överlagrade metoder kan finnas i klassen så länge de aldrig anropas. När du anropar den överlagrade metoden utlöses ett fel.
Alla
static
(ellerShared
) medlemmar måste deklareras som konstanter eller skrivskyddade. Statiska medlemmar kan inte vara föränderliga.Om fältet
SqlUserDefinedTypeAttribute.MaxByteSize
är inställt på-1
kan den serialiserade UDT vara lika stor som storleksgränsen för stora objekt (LOB) (för närvarande 2 GB). Udt-storleken får inte överskrida det värde som anges i fältetMaxByteSized
.
Not
Även om den inte används av servern för att utföra jämförelser kan du implementera System.IComparable
-gränssnittet, som exponerar en enda metod, CompareTo
. Detta används på klientsidan i situationer där det är önskvärt att korrekt jämföra eller sortera UDT-värden.
Intern serialisering
Om du väljer rätt serialiseringsattribut för din UDT beror det på vilken typ av UDT du försöker skapa. Det Native
serialiseringsformatet använder en enkel struktur som gör att SQL Server kan lagra en effektiv intern representation av UDT på disk. Det Native
formatet rekommenderas om UDT är enkelt och endast innehåller fält av följande typer:
Värdetyper som består av fält av dessa typer är bra kandidater för Native
format, till exempel struct
i C#, eller Structure
som de är kända i Visual Basic .NET. En UDT som har angetts med Native
serialiseringsformat kan till exempel innehålla ett fält i ett annat UDT som också har angetts med Native
format. Om UDT-definitionen är mer komplex och innehåller datatyper som inte finns i föregående lista måste du ange UserDefined
serialiseringsformat i stället.
Formatet Native
har följande krav:
Typen får inte ange ett värde för
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize
.Alla fält måste vara serialiserbara.
System.Runtime.InteropServices.StructLayoutAttribute
måste anges somStructLayout.LayoutKindSequential
om UDT definieras i en klass och inte en struktur. Det här attributet styr den fysiska layouten för datafälten och används för att tvinga medlemmarna att anges i den ordning de visas. SQL Server använder det här attributet för att fastställa fältordningen för UDT:er med flera värden.
Ett exempel på en UDT som definierats med Native
serialisering finns i Point
UDT i Skapa användardefinierade typer med ADO.NET.
UserDefined serialisering
Inställningen UserDefined
format för attributet Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
ger utvecklaren fullständig kontroll över det binära formatet. När du anger egenskapen Format
attribut som UserDefined
måste du utföra följande åtgärder i koden:
Ange den valfria egenskapen
IsByteOrdered
attribut. Standardvärdet ärfalse
.Ange egenskapen
MaxByteSize
förMicrosoft.SqlServer.Server.SqlUserDefinedTypeAttribute
.Skriv kod för att implementera
Read
ochWrite
metoder för UDT genom att implementeraSystem.Data.Sql.IBinarySerialize
-gränssnittet.
Ett exempel på en UDT som definierats med UserDefined
serialisering finns i UDT för valuta i Skapa användardefinierade typer med ADO.NET.
Not
UDT-fält måste använda intern serialisering eller bevaras för att indexeras.
Serialiseringsattribut
Attribut avgör hur serialisering används för att konstruera lagringsrepresentationen av UDT:er och för att överföra UDT efter värde till klienten. Du måste ange Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
när du skapar UDT. Attributet Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
anger att klassen är en UDT och anger lagringen för UDT. Du kan också ange attributet Serializable
, även om SQL Server inte kräver detta.
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
har följande egenskaper.
Format
Anger serialiseringsformatet, som kan Native
eller UserDefined
, beroende på datatyperna i UDT.
IsByteOrdered
Ett Boolean
värde som avgör hur SQL Server utför binära jämförelser på UDT.
IsFixedLength
Anger om alla instanser av denna UDT är lika långa.
MaxByteSize
Den maximala storleken på instansen, i byte. Du måste ange MaxByteSize
med UserDefined
serialiseringsformat. För en UDT med användardefinierad serialisering angiven refererar MaxByteSize
till UDT:s totala storlek i sin serialiserade form enligt användarens definition. Värdet för MaxByteSize
måste ligga i intervallet 1
till 8000
, eller anges till -1
för att indikera att UDT är större än 8 000 byte (den totala storleken får inte överskrida den maximala LOB-storleken). Överväg en UDT med en egenskap med en sträng på 10 tecken (System.Char
). När UDT serialiseras med hjälp av en BinaryWriter är den totala storleken på den serialiserade strängen 22 byte: 2 byte per Unicode UTF-16-tecken multiplicerat med det maximala antalet tecken, plus 2 kontrollbyte av omkostnader som uppstår vid serialisering av en binär ström. När du fastställer värdet för MaxByteSize
måste därför den totala storleken på den serialiserade UDT beaktas: storleken på de data som serialiseras i binär form plus omkostnaderna för serialiseringen.
ValidationMethodName
Namnet på den metod som används för att verifiera instanser av UDT.
Ange isbyteordered
När egenskapen Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered
är inställd på true
garanterar du att serialiserade binära data kan användas för semantisk ordning på informationen. Varje instans av ett byteordnat UDT-objekt kan därför bara ha en serialiserad representation. När en jämförelseåtgärd utförs i SQL Server på serialiserade byte bör resultatet vara detsamma som om samma jämförelseåtgärd ägde rum i hanterad kod. Följande funktioner stöds också när IsByteOrdered
är inställt på true
:
Möjligheten att skapa index för kolumner av den här typen.
Möjligheten att skapa primära och externa nycklar samt
CHECK
ochUNIQUE
begränsningar för kolumner av den här typen.Möjligheten att använda satserna Transact-SQL
ORDER BY
,GROUP BY
ochPARTITION BY
. I dessa fall används den binära representationen av typen för att fastställa ordningen.Möjligheten att använda jämförelseoperatorer i Transact-SQL-instruktioner.
Möjligheten att bevara beräknade kolumner av den här typen.
Både Native
- och UserDefined
serialiseringsformaten stöder följande jämförelseoperatorer när IsByteOrdered
är inställt på true
:
- Lika med (
=
) - Inte lika med (
!=
) - Större än (
>
) - Mindre än (
<
) - Större än eller lika med (
>=
) - Mindre än eller lika med (
<=
)
Implementera nullabilitet
Förutom att ange attributen för dina sammansättningar på rätt sätt måste klassen också ha stöd för nullabilitet. UDT:er som läses in i SQL Server är null-medvetna, men för att UDT ska kunna identifiera ett null-värde måste klassen implementera INullable
-gränssnittet. Mer information och ett exempel på hur du implementerar nullbarhet i en UDT finns i Skapa användardefinierade typer med ADO.NET.
Strängkonverteringar
Om du vill stödja strängkonvertering till och från UDT måste du ange en Parse
-metod och en ToString
-metod i klassen. Med metoden Parse
kan en sträng konverteras till en UDT. Den måste deklareras som static
(eller Shared
i Visual Basic) och ta en parameter av typen System.Data.SqlTypes.SqlString
. Mer information och ett exempel på hur du implementerar metoderna Parse
och ToString
finns i Skapa användardefinierade typer med ADO.NET.
XML-serialisering
UDT måste ha stöd för konvertering till och från XML- datatyp genom att följa kontraktet för XML-serialisering. Det System.Xml.Serialization
namnområdet innehåller klasser som används för att serialisera objekt till XML-formatdokument eller -strömmar. Du kan välja att implementera XML- serialisering med hjälp av IXmlSerializable
-gränssnittet, som tillhandahåller anpassad formatering för XML-serialisering och deserialisering.
Förutom att utföra explicita konverteringar från UDT till XML-kan du med XML-serialisering:
Använd XQuery över värden för UDT-instanser efter konvertering till xml- datatyp.
Använd UDT i parametriserade frågor och webbmetoder med interna XML-webbtjänster i SQL Server.
Använd UDT för att ta emot en massinläsning av XML-data.
Serialisera datauppsättningar som innehåller tabeller med UDT-kolumner.
UDT:er serialiseras inte i FOR XML-frågor. Om du vill köra en FOR XML-fråga som visar XML-serialiseringen av UDT konverterar du uttryckligen varje UDT-kolumn till XML- datatyp i SELECT
-instruktionen. Du kan också explicit konvertera kolumnerna till varbinary, varchareller nvarchar.