CREATE TYPE (Transact-SQL)
Crée un type de données alias ou un type défini par l'utilisateur dans la base de données actuelle. L'implémentation d'un type de données d'alias est basé sur un type de système natif SQL Server. Un type défini par l'utilisateur est implémenté à travers une classe d'un assembly dans le CLR Microsoft.NET Framework. Pour lier un type défini par l'utilisateur à son implémentation, l'assembly CLR contenant l'implémentation du type doit d'abord être enregistré dans SQL Server à l'aide de CREATE ASSEMBLY.
[!REMARQUE]
La possibilité d'exécuter un code CLR est désactivée par défaut dans SQL Server. Vous pouvez créer, modifier ou supprimer des objets de base de données qui référencent des modules de code managé, mais ces références ne seront pas exécutées dans SQL Server à moins que l'option clr enabled ne soit activée en utilisant sp_configure.
Syntaxe
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> }
[ <table_constraint> ] [ ,...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 }
}
Arguments
schema_name
Nom du schéma auquel appartient le type de données d'alias ou défini par l'utilisateur.type_name
Nom du type de données d'alias ou défini par l'utilisateur. Les noms de type doivent respecter les règles applicables aux identificateurs.base_type
Type de données fourni par SQL Server sur lequel le type de données d'alias est basé. base_type est de type sysname, sans valeur par défaut, et peut prendre l'une des valeurs suivantes :bigint
binary(n)
bit
char(n)
date
datetime
datetime2
datetimeoffset
decimal
float
image
int
money
nchar(n)
ntext
numeric
nvarchar(n| max)
real
smalldatetime
smallint
smallmoney
sql_variant
text
time
tinyint
uniqueidentifier
varbinary(n| max)
varchar(n| max)
base_type peut également être n'importe quel synonyme de type de données correspondant à un de ces types de données système.
precision
Pour decimal ou numeric, est un entier non négatif indiquant le nombre total maximal de chiffres décimaux pouvant figurer à gauche et à droite de la virgule décimale. Pour plus d'informations, consultez decimal et numeric (Transact-SQL).scale
Pour decimal ou numeric, est un entier non négatif indiquant le nombre maximal de chiffres décimaux qui peuvent figurer à droite d'une virgule décimale ; il doit être inférieur ou égal à la précision. Pour plus d'informations, consultez decimal et numeric (Transact-SQL).NULL | NOT NULL
Précise si le type accepte les valeurs NULL. S'il n'est pas spécifié, la valeur par défaut est NULL.assembly_name
Spécifie l'assembly SQL Server qui référence l'implémentation du type défini par l'utilisateur dans le CLR (Common Language Runtime). assembly_name doit correspondre à un assembly existant dans SQL Server dans la base de données active.[.class_name ]
Spécifie la classe au sein de l'assembly qui implémente le type défini par l'utilisateur. class_name doit être un identificateur valide et doit exister en tant que classe dans l'assembly avec la visibilité de l'assembly. class_name respecte la casse, quel que soit le classement de base de données, et doit correspondre exactement au nom de la classe dans l'assembly correspondant. Le nom de la classe peut être un nom qualifié par un espace de noms entouré de crochets ([ ]) si le langage de programmation qui est utilisé pour écrire la classe utilise le concept des espaces de noms, tel que C#. Si le paramètre class_name n'est pas spécifié, SQL Server suppose qu'il est identique à type_name.<column_definition>
Définit les colonnes pour un type de table défini par l'utilisateur. Pour plus d'informations sur les colonnes, consultez Ajout et suppression de colonnes.<type de données>
Définit le type de données dans une colonne pour un type de table défini par l'utilisateur. Pour plus d'informations sur les types de données, consultez Types de données (Transact-SQL). Pour plus d'informations sur les tables, consultez CREATE TABLE (Transact-SQL).<column_constraint>
Définit les contraintes de colonnes pour un type de table défini par l'utilisateur. Les contraintes prises en charge incluent PRIMARY KEY, UNIQUE et CHECK. Pour plus d'informations sur les contraintes, consultez Garantie de l'intégrité des données. Pour plus d'informations sur les tables, consultez CREATE TABLE (Transact-SQL).<computed_column_definition>
Définit une expression de colonne calculée en tant que colonne dans un type de table défini par l'utilisateur. Pour plus d'informations sur les colonnes calculées, consultez Colonnes calculées. Pour plus d'informations sur les tables, consultez CREATE TABLE (Transact-SQL).<table_constraint>
Définit une contrainte de table sur un type de table défini par l'utilisateur. Les contraintes prises en charge incluent PRIMARY KEY, UNIQUE et CHECK. Pour plus d'informations sur les contraintes de tables, consultez Contraintes.<index_option>
Spécifie la réponse aux erreurs de valeurs de clés dupliquées dans une opération d'insertion de plusieurs lignes dans un index cluster unique ou un index non-cluster unique. Pour plus d'informations sur les options d'index, consultez CREATE INDEX (Transact-SQL).
Notes
Lorsque CREATE TYPE est utilisé pour créer un type CLR défini par l'utilisateur, la compatibilité de base de données doit être 90.
La classe de l'assembly référencé dans assembly_name, ainsi que ses méthodes, doit satisfaire tous les besoins d'implémentation d'un type défini par l'utilisateur dans SQL Server. Pour plus d'informations sur ces indicateurs, consultez Types CLR définis par l'utilisateur.
Les autres considérations portent sur les points suivants :
La classe peut avoir des méthodes surchargées, mais ces méthodes ne peuvent être appelées qu'à partir du code managé, et non à partir de Transact-SQL.
Tous les membres statiques doivent être déclarés en tant que const ou readonly si assembly_name est SAFE ou EXTERNAL_ACCESS.
Au sein d'une base de données, il ne peut y avoir qu'un seul type défini par l'utilisateur enregistré par rapport à tout type spécifié qui a été téléchargé dans SQL Server à partir du CLR. Si un type de données défini par l'utilisateur est créé sur un type CLR pour lequel le type défini par l'utilisateur existe déjà dans la base de données, CREATE TYPE échoue avec une erreur. Cette restriction est nécessaire pour éviter toute ambiguïté dans la résolution de type SQL si un type CLR peut être mappé à plusieurs types définis par l'utilisateur.
Si une méthode mutateur dans le type ne renvoie pas de valeur void, l'instruction CREATE TYPE n'est pas exécutée.
Pour modifier un type défini par l'utilisateur, vous devez supprimer le type à l'aide d'une instruction DROP TYPE, puis le créer de nouveau.
Contrairement aux types définis par l'utilisateur créés à l'aide de sp_addtype, le rôle de base de données public ne dispose pas automatiquement de l'autorisation REFERENCES sur les types créés à l'aide de CREATE TYPE. Cette autorisation doit être accordée séparément.
Dans les types de tables définis par l'utilisateur, les types définis par l'utilisateur structurés utilisés dans column_name <data type> font partie de l'étendue du schéma de base de données dans lequel le type de table est défini. Pour accéder aux types structurés définis par l'utilisateur dans une étendue différente dans la base de données, utilisez des noms en deux parties.
Dans les types de tables définis par l'utilisateur, la clé primaire sur les colonnes calculées doit être PERSISTED et NOT NULL.
Autorisations
Requiert l'autorisation CREATE TYPE dans la base de données actuelle et l'autorisation ALTER sur schema_name. Si schema_name n'est pas spécifié, les règles de résolution de noms par défaut pour déterminer le schéma pour l'utilisateur actuel s'appliquent. Si assembly_name est spécifié, un utilisateur doit posséder l'assembly ou disposer d'une autorisation REFERENCES sur lui.
Exemples
A. Création d'un type d'alias basé sur le type de données varchar
L'exemple suivant crée un type d'alias basé sur le type de données varchar fourni par le système.
CREATE TYPE SSN
FROM varchar(11) NOT NULL ;
B. Création d'un type de données défini par l'utilisateur
L'exemple suivant crée un type Utf8String qui référence la classe utf8string dans l'assembly utf8string. Avant de créer le type, l'assembly utf8string est enregistré dans la base de données locale.
CREATE ASSEMBLY utf8string
FROM '\\ComputerName\utf8string\utf8string.dll' ;
GO
CREATE TYPE Utf8String
EXTERNAL NAME utf8string.[Microsoft.Samples.SqlServer.utf8string] ;
GO
C. Création d'un type de table défini par l'utilisateur
L'exemple suivant crée un type de table défini par l'utilisateur qui possède deux colonnes. Pour plus d'informations sur la création et l'utilisation des paramètres table, consultez Paramètres table (Moteur de base de données).
/* Create a user-defined table type */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT )
GO