Dela via


Krav för användardefinierad typ (UDT)

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 offentlig static (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 (eller Shared) Parse metod som stöder parsning från och en offentlig ToString-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 en Read och en Write-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 attributet XmlIgnore 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 vara true för att kunna jämföra data i byteordning. Om IComparable-gränssnittet inte implementeras och SqlUserDefinedTypeAttribute.IsByteOrdered är falsemisslyckas 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 (eller Shared) 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å -1kan 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ältet MaxByteSized.

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:

bool, byte, sbyte, short, ushort, int, uint, long, ulong, float, double, , , , , , , , ,

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 som StructLayout.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 UserDefinedmåste du utföra följande åtgärder i koden:

  • Ange den valfria egenskapen IsByteOrdered attribut. Standardvärdet är false.

  • Ange egenskapen MaxByteSize för Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.

  • Skriv kod för att implementera Read och Write metoder för UDT genom att implementera System.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 MaxByteSizemå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å truegaranterar 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 och UNIQUE begränsningar för kolumner av den här typen.

  • Möjligheten att använda satserna Transact-SQL ORDER BY, GROUP BYoch PARTITION 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.