Delen via


CREATE TYPE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric Preview

Hiermee maakt u een aliasgegevenstype of een door de gebruiker gedefinieerd type in de huidige database in SQL Server of Azure SQL Database. De implementatie van een aliasgegevenstype is gebaseerd op een systeemtype database-engine. Een door de gebruiker gedefinieerd type wordt geïmplementeerd via een klasse van een assembly in de Common Language Runtime (CLR) van Microsoft .NET Framework. Als u een door de gebruiker gedefinieerd type aan de implementatie wilt binden, moet de CLR-assembly die de implementatie van het type bevat, eerst worden geregistreerd in de database-engine met behulp van CREATE ASSEMBLY.

De mogelijkheid om CLR-code uit te voeren, is standaard uitgeschakeld in SQL Server. U kunt databaseobjecten maken, wijzigen en verwijderen die verwijzen naar beheerde codemodules. Deze verwijzingen worden echter niet uitgevoerd in SQL Server, tenzij de optie clr is ingeschakeld met behulp van sp_configure.

Note

De integratie van .NET Framework CLR in SQL Server wordt in dit artikel besproken. CLR-integratie is niet van toepassing op Azure SQL Database of SQL-database in Microsoft Fabric Preview, waarbij CLR-typen (.NET) niet worden ondersteund.

Transact-SQL syntaxis-conventies

Syntax

Door de gebruiker gedefinieerde syntaxis van het gegevenstype:

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)]

Door de gebruiker gedefinieerde syntaxis voor tabeltypen die zijn geoptimaliseerd voor geheugen:

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

De naam van het schema waartoe het aliasgegevenstype of het door de gebruiker gedefinieerde type behoort.

type_name

De naam van het aliasgegevenstype of het door de gebruiker gedefinieerde type. Typenamen moeten voldoen aan de regels voor id's.

base_type

De database-engine heeft een gegevenstype opgegeven waarop het aliasgegevenstype is gebaseerd. base_type is sysname, zonder standaard, en kan een van de volgende waarden zijn:

  • bigint, int, smallint en tinyint
  • binary(n), varbinary(n), en varbinary(max)
  • bit
  • char(n), nchar(n), nvarchar(n), nvarchar(max), varchar(n), en varchar(max)
  • datum, datum/tijd, datum/tijd2, datetimeoffset, smalldatetime en tijd
  • decimaal en numeriek
  • float en echt
  • image
  • geld en kleingeld
  • sql_variant
  • tekst en ntekst
  • uniqueidentifier

base_type kan ook elk synoniem van het gegevenstype zijn dat is toegewezen aan een van deze systeemgegevenstypen.

precision

Voor decimaal of numeriek is precisie een niet-negatief geheel getal dat het maximumaantal decimale cijfers aangeeft dat kan worden opgeslagen, zowel links als rechts van het decimaalteken. Zie decimaal en numeriek (Transact-SQL) voor meer informatie.

scale

Voor decimaal of numeriek is de schaal een niet-negatief geheel getal dat het maximumaantal decimale cijfers aangeeft dat rechts van het decimaalteken kan worden opgeslagen en moet deze kleiner zijn dan of gelijk zijn aan de precisie. Zie decimaal en numeriek (Transact-SQL) voor meer informatie.

NULL | NIET NULL

Hiermee geeft u op of het type een null-waarde kan bevatten. Als dit niet is opgegeven, NULL is dit de standaardwaarde.

assembly_name

Van toepassing op: SQL Server

Hiermee geeft u de SQL Server-assembly op die verwijst naar de implementatie van het door de gebruiker gedefinieerde type in de algemene taalruntime. assembly_name moet overeenkomen met een bestaande assembly in SQL Server in de huidige database.

Note

EXTERNAL_NAME is niet beschikbaar in een ingesloten database.

[ . class_name ]

Van toepassing op: SQL Server

Hiermee geeft u de klasse binnen de assembly waarmee het door de gebruiker gedefinieerde type wordt geïmplementeerd. class_name moet een geldige id zijn en moet bestaan als een klasse in de assembly met zichtbaarheid van de assembly. class_name hoofdlettergevoelig is, ongeacht de sortering van de database, en moet exact overeenkomen met de klassenaam in de bijbehorende assembly. De klassenaam kan een naamruimte-gekwalificeerde naam tussen vierkante haken ([ ]) zijn als de programmeertaal die wordt gebruikt voor het schrijven van de klasse gebruikmaakt van het concept van naamruimten, zoals C#. Als class_name niet is opgegeven, gaat SQL Server ervan uit dat deze hetzelfde is als type_name.

<column_definition>

Hiermee definieert u de kolommen voor een door de gebruiker gedefinieerd tabeltype.

<gegevenstype>

Hiermee definieert u het gegevenstype in een kolom voor een door de gebruiker gedefinieerd tabeltype. Zie Gegevenstypen (Transact-SQL) voor meer informatie over gegevenstypen. Zie CREATE TABLE (Transact-SQL) voor meer informatie over tabellen.

<column_constraint>

Hiermee definieert u de kolombeperkingen voor een door de gebruiker gedefinieerd tabeltype. Ondersteunde beperkingen zijn onder andere PRIMARY KEY, UNIQUEen CHECK. Zie CREATE TABLE (Transact-SQL) voor meer informatie over tabellen.

<computed_column_definition>

Definieert een berekende kolomexpressie als een kolom in een door de gebruiker gedefinieerd tabeltype. Zie CREATE TABLE (Transact-SQL) voor meer informatie over tabellen.

<table_constraint>

Hiermee definieert u een tabelbeperking voor een door de gebruiker gedefinieerd tabeltype. Ondersteunde beperkingen zijn onder andere PRIMARY KEY, UNIQUEen CHECK.

<index_option>

Hiermee geeft u de foutreactie op dubbele sleutelwaarden in een invoegbewerking met meerdere rijen op een unieke geclusterde of unieke niet-geclusterde index. Zie INDEX MAKEN (Transact-SQL) voor meer informatie over indexopties.

INDEX index_name [ GECLUSTERD | NIET GECLUSTERD ] ( column_name [ ASC | DESC ] [ , ... n ] )

van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance.

Hiermee geeft u een index voor de tabel te maken. Dit kan een geclusterde index of een niet-geclusterde index zijn. De index bevat de kolommen die worden vermeld en sorteert de gegevens in oplopende of aflopende volgorde.

INDEX

U moet kolom- en tabelindexen opgeven als onderdeel van de CREATE TABLE instructie. CREATE INDEX en DROP INDEX worden niet ondersteund voor tabellen die zijn geoptimaliseerd voor geheugen.

MEMORY_OPTIMIZED

van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database en Azure SQL Managed Instance. Azure SQL Managed Instance biedt geen ondersteuning voor tabellen die zijn geoptimaliseerd voor geheugen in de laag Algemeen gebruik.

Geeft aan of het tabeltype geoptimaliseerd is voor geheugen. Deze optie is standaard uitgeschakeld; de tabel (type) is geen voor geheugen geoptimaliseerde tabel (type). Tabeltypen die zijn geoptimaliseerd voor geheugen zijn voor geheugen geoptimaliseerde gebruikerstabellen, waarvan het schema op schijf wordt bewaard, vergelijkbaar met andere gebruikerstabellen.

BUCKET_COUNT

Van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database, Azure SQL Database en Azure SQL Managed Instance.

Geeft het aantal buckets aan dat moet worden gemaakt in de hash-index. De maximumwaarde voor BUCKET_COUNT in hash-indexen is 1.073.741.824. Zie Indexen voor Memory-Optimized Tabellen voor meer informatie over het aantal buckets. bucket_count is een verplicht argument.

HASH

Van toepassing op: SQL Server 2014 (12.x) en latere versies, Azure SQL Database, Azure SQL Database en Azure SQL Managed Instance.

Geeft aan dat er een HASH index wordt gemaakt. Hash-indexen worden alleen ondersteund voor tabellen die zijn geoptimaliseerd voor geheugen.

Remarks

De klasse van de assembly waarnaar wordt verwezen in assembly_name, samen met de bijbehorende methoden, moet voldoen aan alle vereisten voor het implementeren van een door de gebruiker gedefinieerd type in SQL Server. Zie CLR User-Defined Typen voor meer informatie over deze vereisten.

Aanvullende overwegingen zijn onder andere:

  • De klasse kan overbelaste methoden bevatten, maar deze methoden kunnen alleen worden aangeroepen vanuit beheerde code, niet vanuit Transact-SQL.

  • Statische leden moeten worden gedeclareerd als const of readonly als assembly_name is SAFE of EXTERNAL_ACCESS.

In een database kan er slechts één door de gebruiker gedefinieerd type zijn geregistreerd voor elk opgegeven type dat is geüpload in SQL Server vanuit de CLR. Als er een door de gebruiker gedefinieerd type wordt gemaakt op een CLR-type waarvoor al een door de gebruiker gedefinieerd type bestaat in de database, CREATE TYPE mislukt dit met een fout. Deze beperking is vereist om dubbelzinnigheid te voorkomen tijdens het oplossen van SQL-typen als een CLR-type kan worden toegewezen aan meer dan één door de gebruiker gedefinieerd type.

Als een mutatormethode in het type geen ongeldige waarde retourneert, wordt de CREATE TYPE instructie niet uitgevoerd.

Als u een door de gebruiker gedefinieerd type wilt wijzigen, moet u het type verwijderen met behulp van een DROP TYPE instructie en het vervolgens opnieuw maken.

In tegenstelling tot door de gebruiker gedefinieerde typen die worden gemaakt met behulp sp_addtypevan, wordt de rol openbare database niet automatisch machtigingen verleend REFERENCES voor typen die worden gemaakt met behulp van CREATE TYPE. Deze machtiging moet afzonderlijk worden verleend.

In door de gebruiker gedefinieerde tabeltypen maken gestructureerde door de gebruiker gedefinieerde typen die worden gebruikt in column_name<gegevenstype> deel uit van het databaseschemabereik waarin het tabeltype wordt gedefinieerd. Gebruik tweedelige namen om toegang te krijgen tot gestructureerde door de gebruiker gedefinieerde typen in een ander bereik binnen de database.

In door de gebruiker gedefinieerde tabeltypen moet de primaire sleutel voor berekende kolommen en PERSISTEDNOT NULL.

In de Fabric SQL-database kunnen door de gebruiker gedefinieerde typen worden gemaakt, maar worden ze niet gespiegeld naar Fabric OneLake en worden kolommen met door de gebruiker gedefinieerde typen overgeslagen in spiegeling.

Tabeltypen die zijn geoptimaliseerd voor geheugen

Vanaf SQL Server 2014 (12.x) kunnen gegevens in een tabeltype worden verwerkt in het primaire geheugen en niet op schijf. Zie In-Memory OLTP-overzicht en gebruiksscenario's voor meer informatie. Zie Een Memory-Optimized Tabel en een systeemeigen gecompileerde opgeslagen procedure maken voor codevoorbeelden die laten zien hoe u tabeltypen maakt die zijn geoptimaliseerd voor geheugen.

Permissions

Vereist CREATE TYPE toestemming in de huidige database en ALTER machtiging voor schema_name. Als schema_name niet is opgegeven, zijn de standaardregels voor naamomzetting voor het bepalen van het schema voor de huidige gebruiker van toepassing. Als assembly_name is opgegeven, moet een gebruiker eigenaar zijn van de assembly of toestemming hebben REFERENCES .

Als kolommen in de CREATE TABLE-instructie zijn gedefinieerd als een door de gebruiker gedefinieerd type, is REFERENCES machtiging voor het door de gebruiker gedefinieerde type vereist.

Een gebruiker die een tabel maakt met een kolom die gebruikmaakt van een door de gebruiker gedefinieerd type, heeft de REFERENCES machtiging nodig voor het door de gebruiker gedefinieerde type. Als deze tabel moet worden gemaakt, tempdbmoet de REFERENCES machtiging expliciet worden verleend voordat de tabel wordt gemaakt, of dit gegevenstype en REFERENCES deze machtiging moeten worden toegevoegd aan de model database. For example:

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

Als dit gebeurt, zijn dit gegevenstype en REFERENCES de machtiging permanent beschikbaar tempdb . Anders verdwijnen het door de gebruiker gedefinieerde gegevenstype en de machtigingen wanneer SQL Server opnieuw wordt opgestart. Zie CREATE TABLEvoor meer informatie.

Als u niet wilt dat elke nieuwe database de definitie en machtigingen voor dit door de gebruiker gedefinieerde gegevenstype van het model over neemt, kunt u een opgeslagen opstartprocedure gebruiken om alleen de juiste machtigingen in tempdb de database te maken en toe te wijzen. 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

U kunt ook overwegen om in plaats van tijdelijke tabellen tabelvariabelen te gebruiken wanneer u moet verwijzen naar door de gebruiker gedefinieerde gegevenstypen voor tijdelijke opslagbehoeften. Voor tabelvariabelen om te verwijzen naar door de gebruiker gedefinieerde gegevenstypen, hoeft u niet expliciet machtigingen te verlenen voor het door de gebruiker gedefinieerde gegevenstype.

Examples

A. Een aliastype maken op basis van het varchar-gegevenstype

In het volgende voorbeeld wordt een aliastype gemaakt op basis van het door het systeem geleverde varchar gegevenstype.

CREATE TYPE SSN
FROM VARCHAR(11) NOT NULL;

B. Een door de gebruiker gedefinieerd type maken

Van toepassing op: SQL Server

In het volgende voorbeeld wordt een type Utf8String gemaakt dat verwijst naar klasse utf8string in de assembly utf8string. Voordat u het type maakt, wordt assembly utf8string geregistreerd in de lokale database. Vervang het binaire gedeelte van de CREATE ASSEMBLY instructie door een geldige beschrijving.

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

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

C. Een door de gebruiker gedefinieerd tabeltype maken

In het volgende voorbeeld wordt een door de gebruiker gedefinieerd tabeltype gemaakt met twee kolommen. Zie Table-Valued Parameters (Database Engine) gebruiken voor meer informatie over het maken en gebruiken van parameters met tabelwaarden.

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

D. Een door de gebruiker gedefinieerd tabeltype maken met primaire sleutel en index

In het volgende voorbeeld wordt een door de gebruiker gedefinieerd tabeltype gemaakt met drie kolommen, waarvan een (Name) de primaire sleutel is en een andere (Price) een niet-geclusterde index heeft. Zie Table-Valued Parameters (Database Engine) gebruiken voor meer informatie over het maken en gebruiken van parameters met tabelwaarden.

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