Dela via


SKAPA TYP (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Förhandsversion av Microsoft Fabric

Skapar en aliasdatatyp eller en användardefinierad typ i den aktuella databasen i SQL Server eller Azure SQL Database. Implementeringen av en aliasdatatyp baseras på en inbyggd systemtyp för databasmotorn. En användardefinierad typ implementeras via en klass för en sammansättning i Microsoft .NET Framework Common Language Runtime (CLR). Om du vill binda en användardefinierad typ till implementeringen måste den CLR-sammansättning som innehåller implementeringen av typen först registreras i databasmotorn med hjälp av CREATE ASSEMBLY.

Möjligheten att köra CLR-kod är inaktiverad som standard i SQL Server. Du kan skapa, ändra och släppa databasobjekt som refererar till hanterade kodmoduler. Dessa referenser körs dock inte i SQL Server om inte det clr-aktiverade alternativet aktiveras med hjälp av sp_configure.

Note

Integreringen av .NET Framework CLR i SQL Server beskrivs i den här artikeln. CLR-integrering gäller inte för Azure SQL Database eller SQL Database i Microsoft Fabric Preview, där CLR-typer (.NET) inte stöds.

Transact-SQL syntaxkonventioner

Syntax

Användardefinierad datatypssyntax:

CREATE TYPE [ schema_name. ] type_name
{
      FROM base_type
      [ ( precision [ , scale ] ) ]
      [ NULL | NOT NULL ]
    | EXTERNAL NAME assembly_name [ .class_name ]
    | AS TABLE ( { <column_definition> | <computed_column_definition> [ , ...n ]
      [ <table_constraint> ] [ , ...n ]
      [ <table_index> ] [ , ...n ] } )
} [ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]
    [
        DEFAULT constant_expression ]
      | [ IDENTITY [ ( seed , increment ) ]
    ]
    [ ROWGUIDCOL ] [ <column_constraint> [ ...n ] ]

<data type> ::=
[ type_schema_name . ] type_name
    [ ( precision [ , scale ] | max |
                [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]

<column_constraint> ::=
{ { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [
            WITH ( <index_option> [ , ...n ] )
        ]
  | CHECK ( logical_expression )
}

<computed_column_definition> ::=
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [
            WITH ( <index_option> [ , ...n ] )
        ]
    | CHECK ( logical_expression )
]

<table_constraint> ::=
{
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
    ( column [ ASC | DESC ] [ , ...n ] )
        [
    WITH ( <index_option> [ , ...n ] )
        ]
    | CHECK ( logical_expression )
}

<index_option> ::=
{
    IGNORE_DUP_KEY = { ON | OFF }
}

< table_index > ::=
  INDEX index_name
     [ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ , ...n ] )
     [INCLUDE (column, ...n)]

Syntax för användardefinierade minnesoptimerade tabelltyper:

CREATE TYPE [ schema_name. ] type_name
AS TABLE ( { <column_definition> [ , ...n ] }
    | [ <table_constraint> ] [ , ...n ]
    | [ <table_index> ] [ , ...n ] )
    [ WITH ( <table_option> [ , ...n ] ) ]
 [ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ] [ NULL | NOT NULL ]
      [ IDENTITY [ (1 , 1) ]
    ]
    [ <column_constraint> [ , ...n ] ] [ <column_index> ]

<data type> ::=
 [ type_schema_name . ] type_name [ ( precision [ , scale ] ) ]

<column_constraint> ::=
{ PRIMARY KEY { NONCLUSTERED HASH WITH ( BUCKET_COUNT = bucket_count )
                | NONCLUSTERED }
}

< table_constraint > ::=
{ PRIMARY KEY { NONCLUSTERED HASH (column [ , ...n ] )
                   WITH ( BUCKET_COUNT = bucket_count )
               | NONCLUSTERED ( column [ ASC | DESC ] [ , ...n ] )
           }
}

<column_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ , ...n ] ) WITH ( BUCKET_COUNT = bucket_count ) 
      | NONCLUSTERED ( column [ ASC | DESC ] [ , ...n ] )
}

< table_index > ::=
  INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ , ...n ] ) WITH ( BUCKET_COUNT = bucket_count )
    | [ NONCLUSTERED ] ( column [ ASC | DESC ] [ , ...n ] )
}

<table_option> ::=
{
    [ MEMORY_OPTIMIZED = { ON | OFF } ]
}

Arguments

schema_name

Namnet på schemat som aliasdatatypen eller den användardefinierade typen tillhör.

type_name

Namnet på aliasdatatypen eller användardefinierad typ. Typnamn måste följa reglerna för identifierare.

base_type

Databasmotorn angav datatypen som aliasdatatypen baseras på. base_type är sysname, utan standard, och kan vara något av följande värden:

  • bigint, int, smallint och tinyint
  • binary(n), varbinary(n)och varbinary(max)
  • bit
  • char(n), nchar(n), nvarchar(n), nvarchar(max), varchar(n) och varchar(max)
  • date, datetime, datetime2, datetimeoffset, smalldatetime och time
  • decimal ochnumerisk
  • flyttal och verklig
  • image
  • pengar och småpengar
  • sql_variant
  • text och ntext
  • uniqueidentifier

base_type kan också vara valfri synonym för datatyper som mappar till någon av dessa systemdatatyper.

precision

För decimaler eller numeriska är precision ett icke-negativt heltal som anger det maximala totala antalet decimalsiffror som kan lagras, både till vänster och till höger om decimaltecknet. Mer information finns i decimaler och numeriska (Transact-SQL).

scale

För decimaler eller numeriska är skala ett icke-negativt heltal som anger det maximala antalet decimalsiffror som kan lagras till höger om decimaltecknet, och det måste vara mindre än eller lika med precisionen. Mer information finns i decimaler och numeriska (Transact-SQL).

NULL | INTE NULL

Anger om typen kan innehålla ett null-värde. Om det inte anges NULL är standardvärdet.

assembly_name

Gäller för: SQL Server

Anger den SQL Server-sammansättning som refererar till implementeringen av den användardefinierade typen i den vanliga språkkörningen. assembly_name ska matcha en befintlig sammansättning i SQL Server i den aktuella databasen.

Note

EXTERNAL_NAME är inte tillgängligt i en innesluten databas.

[ . class_name ]

Gäller för: SQL Server

Anger klassen i sammansättningen som implementerar den användardefinierade typen. class_name måste vara en giltig identifierare och måste finnas som en klass i sammansättningen med sammansättningssynlighet. class_name är skiftlägeskänslig, oavsett databassortering, och måste exakt matcha klassnamnet i motsvarande sammansättning. Klassnamnet kan vara ett namnområdeskvalificerat namn inom hakparenteser ([ ]) om programmeringsspråket som används för att skriva klassen använder begreppet namnområden, till exempel C#. Om class_name inte anges förutsätter SQL Server att det är samma som type_name.

<column_definition>

Definierar kolumnerna för en användardefinierad tabelltyp.

<datatyp>

Definierar datatypen i en kolumn för en användardefinierad tabelltyp. Mer information om datatyper finns i Datatyper (Transact-SQL). Mer information om tabeller finns i CREATE TABLE (Transact-SQL).

<column_constraint>

Definierar kolumnbegränsningarna för en användardefinierad tabelltyp. Begränsningar som stöds är PRIMARY KEY, UNIQUEoch CHECK. Mer information om tabeller finns i CREATE TABLE (Transact-SQL).

<computed_column_definition>

Definierar ett beräknat kolumnuttryck som en kolumn i en användardefinierad tabelltyp. Mer information om tabeller finns i CREATE TABLE (Transact-SQL).

<table_constraint>

Definierar en tabellbegränsning för en användardefinierad tabelltyp. Begränsningar som stöds är PRIMARY KEY, UNIQUEoch CHECK.

<index_option>

Anger felsvaret på duplicerade nyckelvärden i en infogad åtgärd med flera rader i ett unikt grupperat eller unikt icke-grupperat index. Mer information om indexalternativ finns i CREATE INDEX (Transact-SQL) .

INDEX index_name [ KLUSTRAD | NONCLUSTERED ] ( column_name [ ASC | DESC ] [ , ... n ] )

gäller för: SQL Server 2014 (12.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance.

Anger att du vill skapa ett index i tabellen. Detta kan vara ett klustrat index eller ett icke-grupperat index. Indexet innehåller de kolumner som visas och sorterar data i antingen stigande eller fallande ordning.

INDEX

Du måste ange kolumn- och tabellindex som en del av -instruktionen CREATE TABLE . CREATE INDEX och DROP INDEX stöds inte för minnesoptimerade tabeller.

MEMORY_OPTIMIZED

gäller för: SQL Server 2014 (12.x) och senare versioner, Azure SQL Database och Azure SQL Managed Instance. Azure SQL Managed Instance stöder inte minnesoptimerade tabeller på nivån Generell användning.

Anger om tabelltypen är minnesoptimerad. Det här alternativet är inaktiverat som standard. tabellen (typ) är inte en minnesoptimerad tabell (typ). Minnesoptimerade tabelltyper är minnesoptimerade användartabeller, vars schema sparas på en disk som liknar andra användartabeller.

BUCKET_COUNT

Gäller för: SQL Server 2014 (12.x) och senare versioner, Azure SQL Database, Azure SQL Database och Azure SQL Managed Instance.

Anger antalet bucketar som ska skapas i hash-indexet. Det maximala värdet för BUCKET_COUNT i hash-index är 1 073 741 824. Mer information om bucketantal finns i Index för Memory-Optimized-tabeller. bucket_count är ett obligatoriskt argument.

HASH

Gäller för: SQL Server 2014 (12.x) och senare versioner, Azure SQL Database, Azure SQL Database och Azure SQL Managed Instance.

Anger att ett HASH index har skapats. Hash-index stöds endast i minnesoptimerade tabeller.

Remarks

Klassen för sammansättningen som refereras i assembly_name, tillsammans med dess metoder, bör uppfylla alla krav för att implementera en användardefinierad typ i SQL Server. Mer information om dessa krav finns i CLR-User-Defined Typer.

Ytterligare överväganden är följande:

  • Klassen kan innehålla överlagrade metoder, men dessa metoder kan bara anropas inifrån hanterad kod, inte från Transact-SQL.

  • Statiska medlemmar måste deklareras som const eller readonly om assembly_name är SAFE eller EXTERNAL_ACCESS.

I en databas kan det bara finnas en användardefinierad typ registrerad mot en angiven typ som har laddats upp i SQL Server från CLR. Om en användardefinierad typ skapas på en CLR-typ för vilken en användardefinierad typ redan finns i databasen misslyckas CREATE TYPE med ett fel. Den här begränsningen krävs för att undvika tvetydighet under SQL-typmatchning om en CLR-typ kan mappas till mer än en användardefinierad typ.

Om någon mutatormetod i typen inte returnerar void körs inte -instruktionen CREATE TYPE .

Om du vill ändra en användardefinierad typ måste du släppa typen med hjälp av en DROP TYPE -instruktion och sedan återskapa den.

Till skillnad från användardefinierade typer som skapas med hjälp sp_addtypeav beviljas REFERENCES inte den offentliga databasrollen automatiskt behörighet för typer som skapas med hjälp CREATE TYPEav . Den här behörigheten måste beviljas separat.

I användardefinierade tabelltyper ingår strukturerade användardefinierade typer som används i column_name<datatyp> i databasschemat där tabelltypen definieras. Om du vill komma åt strukturerade användardefinierade typer i ett annat omfång i databasen använder du tvådelade namn.

I användardefinierade tabelltyper måste primärnyckeln för beräknade kolumner vara PERSISTED och NOT NULL.

I Fabric SQL-databasen kan användardefinierade typer skapas men speglas inte i Fabric OneLake, och kolumner av användardefinierade typer hoppas över i spegling.

Minnesoptimerade tabelltyper

Från och med SQL Server 2014 (12.x) kan bearbetning av data i en tabelltyp göras i primärt minne och inte på disk. Mer information finns iIn-Memory OLTP-översikt och användningsscenarier. Kodexempel som visar hur du skapar minnesoptimerade tabelltyper finns i Skapa en Memory-Optimized-tabell och en intern kompilerad lagrad procedur.

Permissions

Kräver CREATE TYPE behörighet i den aktuella databasen och ALTER behörighet för schema_name. Om schema_name inte anges gäller standardreglerna för namnmatchning för att fastställa schemat för den aktuella användaren. Om assembly_name anges måste en användare antingen äga sammansättningen eller ha REFERENCES behörighet för den.

Om några kolumner i CREATE TABLE-instruktionen definieras som av en användardefinierad typ krävs REFERENCES behörighet för den användardefinierade typen.

En användare som skapar en tabell med en kolumn som använder en användardefinierad typ behöver behörigheten REFERENCES för den användardefinierade typen. Om den här tabellen måste skapas i tempdbmåste antingen behörigheten REFERENCES beviljas explicit varje gång innan tabellen skapas, eller så måste den här datatypen och REFERENCES behörigheten läggas till i model databasen. For example:

CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GO
GRANT REFERENCES ON TYPE::dbo.udt_money TO public

Om detta görs kommer den här datatypen och REFERENCES behörigheten att vara tillgängliga tempdb permanent. Annars försvinner den användardefinierade datatypen och behörigheterna när SQL Server startas om. Mer information finns i CREATE TABLE.

Om du inte vill att alla nya databaser ska ärva definitionen och behörigheterna för den här användardefinierade datatypen från modellen kan du använda en startlagringsprocedur för att skapa och tilldela lämpliga behörigheter endast i tempdb databasen. For example:

USE master
GO
CREATE PROCEDURE setup_udt_in_tempdb
AS
EXEC ( 'USE tempdb;
CREATE TYPE dbo.udt_money FROM varchar(11) NOT NULL;
GRANT REFERENCES ON TYPE::dbo.udt_money TO public;')
GO
EXEC sp_procoption 'setup_udt_in_tempdb' , 'startup' , 'on'
GO

Du kan också överväga att använda tabellvariabler i stället för att använda tillfälliga tabeller när du behöver referera till användardefinierade datatyper för tillfälliga lagringsbehov. För att tabellvariabler ska referera till användardefinierade datatyper behöver du inte uttryckligen bevilja behörigheter för den användardefinierade datatypen.

Examples

A. Skapa en aliastyp baserat på datatypen varchar

I följande exempel skapas en aliastyp baserat på datatypen som tillhandahålls varchar av systemet.

CREATE TYPE SSN
FROM VARCHAR(11) NOT NULL;

B. Skapa en användardefinierad typ

gäller för: SQL Server

I följande exempel skapas en typ Utf8String som refererar till klassen utf8string i sammansättningen utf8string. Innan du skapar typen registreras sammansättningen utf8string i den lokala databasen. Ersätt den binära delen av -instruktionen CREATE ASSEMBLY med en giltig beskrivning.

CREATE ASSEMBLY utf8string
AUTHORIZATION [dbi]
FROM 0x4D... ;
GO

CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string];
GO

C. Skapa en användardefinierad tabelltyp

I följande exempel skapas en användardefinierad tabelltyp som har två kolumner. Mer information om hur du skapar och använder tabellvärdesparametrar finns i Använda Table-Valued parametrar (databasmotor).

CREATE TYPE LocationTableType AS TABLE (
    LocationName VARCHAR(50),
    CostRate INT
);
GO

D. Skapa en användardefinierad tabelltyp med primärnyckel och index

I följande exempel skapas en användardefinierad tabelltyp som har tre kolumner, varav en (Name) är primärnyckeln och en annan (Price) har ett icke-grupperat index. Mer information om hur du skapar och använder tabellvärdesparametrar finns i Använda Table-Valued parametrar (databasmotor).

CREATE TYPE InventoryItem AS TABLE (
    [Name] NVARCHAR(50) NOT NULL,
    SupplierId BIGINT NOT NULL,
    Price DECIMAL(18, 4) NULL,
    PRIMARY KEY (Name),
    INDEX IX_InventoryItem_Price(Price)
);
GO