Utilisation de types de données spécifiques

Cette rubrique décrit les types de données spécifiques qui sont disponibles dans SQL Server. Les types de données spécifiques sont ceux qui ne rentrent dans aucune des autres catégories de types de données. Dans SQL Server, les types de données spécifiques incluent les types de données bit, hierarchyid, sql_variant, sysname, table, timestamp et d'alias.

bit

Le type de données bit est un type de données numérique qui stocke 0 ou 1. Les valeurs de chaîne True et False peuvent être converties en valeurs bit, comme illustré dans l'exemple ci-dessous :

SELECT CONVERT (bit, 'true')
SELECT CONVERT(bit, 'false')

Dans cet exemple, true est convertie 1 et false est convertie en 0. Les données bit n'ont pas besoin d'être mises entre guillemets simples.

hierarchyid

Le type de données hierarchyid est utilisé pour gérer des données hiérarchiques et des tables qui ont une structure hiérarchique. Pour utiliser des données hiérarchiques dans le code Transact-SQL, utilisez les fonctions hierarchyid. Pour plus d'informations, consultez Utilisation des types de données hierarchyid (moteur de base de données).

sql_variant

Le type de données sql_variant permet à une colonne, un paramètre ou une variable de stocker des valeurs de données de différents types de données. Chaque instance d'une colonne sql_variant enregistre la valeur de données et les métadonnées décrivant la valeur. Les métadonnées suivantes sont disponibles :

  • Type de données de base

  • Taille maximale

  • Échelle

  • Précision

  • Classement

Pour extraire des métadonnées pour une instance sql_variant spécifique, utilisez la fonction SQL_VARIANT_PROPERTY.

Dans l'exemple suivant, la deuxième table contient une colonne sql_variant :

CREATE TABLE ObjectTable (
   ObjectID int CONSTRAINT PKObjectTable PRIMARY KEY,
   ObjectName nvarchar(80),
   ObjectWeight decimal(10,3),
   ObjectColor nvarchar(20))
CREATE TABLE VariablePropertyTable (
   ObjectID int REFERENCES ObjectTable(ObjectID),
   PropertyName nvarchar(100),
   PropertyValue sql_variant,
   CONSTRAINT PKVariablePropertyTable
   PRIMARY KEY(ObjectID, PropertyName))

sysname

Le type de données sysname qui est est utilisé pour les colonnes de tables, les variables et les paramètres de procédures stockées qui stockent des noms d'objets. La définition exacte de sysname se rapporte aux règles applicables aux identificateurs. Par conséquent, elle peut varier entre les instances de SQL Server. sysname est, du point de vue fonctionnel, identique à nvarchar(128), si ce n'est que, par défaut, sysname est NOT NULL. Dans les versions précédentes de SQL Server, sysname est défini en tant que varchar(30).

Important

Dans les bases de données qui respectent la casse ou qui possèdent un classement binaire, sysname n'est reconnu en tant que type de données système SQL Server que s'il est affiché en minuscules.

table

Le type de données table fonctionne comme une table temporaire. Il est utilisé pour stocker un jeu de résultats en vue d'un traitement ultérieur. Ce type de données permet uniquement de définir des variables locales de type table et la valeur de retour d'une fonction utilisateur.

La définition d'une variable de table ou d'une valeur de retour comprend les définitions des colonnes, le type de données, la précision et l'échelle de chaque colonne, ainsi que les contraintes facultatives PRIMARY KEY, UNIQUE, NULL et CHECK. Une table définie par l'utilisateur ne peut pas être utilisée comme type de données.

Le format des lignes qui sont stockées dans une variable de table ou qui sont renvoyées par une fonction définie par l'utilisateur doit être défini lorsque la variable est déclarée ou que la fonction est créée. La syntaxe est basée sur la syntaxe CREATE TABLE, par exemple :

DECLARE @TableVar TABLE (Cola int PRIMARY KEY, Colb char(3))
INSERT INTO @TableVar VALUES (1, 'abc')
INSERT INTO @TableVar VALUES (2, 'def')
SELECT * FROM @TableVar
GO

Les variables de table et les fonctions définies par l'utilisateur qui retournent une table peuvent uniquement être utilisées dans certaines instructions SELECT et INSERT, ainsi que là où les tables sont prises en charge dans les instructions UPDATE, DELETE et DECLARE CURSOR. Les variables de table et les fonctions définies par l'utilisateur qui retournent une table ne peuvent pas être utilisées dans d'autres instructions Transact-SQL.

Les index ou autres contraintes qui sont appliqués à la table doivent être définis dans la variable DECLARE ou dans l'instruction CREATE FUNCTION. Ils ne peuvent pas être appliqués ultérieurement, car les instructions CREATE INDEX ou ALTER TABLE ne peuvent pas référencer des variables de table et des fonctions définies par l'utilisateur.

Pour plus d'informations sur la syntaxe qui est utilisée pour définir les variables table et les fonctions définies par l'utilisateur, consultez DECLARE @local_variable (Transact-SQL) et CREATE FUNCTION (Transact-SQL).

timestamp

Le type de données timestamp n'a aucun lien avec les dates et les heures. Les valeurs timestamp sont des nombres binaires qui indiquent l'ordre relatif dans lequel ont lieu les modifications dans une base de données.

N'utilisez jamais de colonnes timestamp dans les clés, surtout les clés primaires, car la valeur timestamp change toutes les fois que la ligne est modifiée.

Pour enregistrer les dates et heures des modifications de données qui se produisent dans une table, utilisez le type de données datetime2 ou smalldatetime afin d'enregistrer les événements et déclencheurs destinés à mettre à jour automatiquement les valeurs en cas de modification.

Types de données alias

Les types de données d'alias vous permettent d'étendre un type de données de base SQL Server, tel que varchar, avec un nom descriptif et un format personnalisable en vue d'une utilisation spécifique. Par exemple, l'instruction suivante implémente un type de données défini par l'utilisateur birthday qui est basé sur le type de données datetime et qui autorise les valeurs NULL (NULL):

EXEC sp_addtype birthday, datetime, 'NULL'

Sélectionnez avec précaution les types de base pour l'implémentation des types de données définis par l'utilisateur. Par exemple, aux États-Unis, les numéros de sécurité sociale (SSN) se présentent sous le format nnn-nn-nnnn. Même s'ils contiennent des nombres, ces nombres constituent un identificateur et ne sont pas soumis à des opérations mathématiques. Par conséquent, Il est courant de créer un type de données Numéros de sécurité sociale défini par l'utilisateur au format varchar et de créer une contrainte CHECK pour appliquer le format des numéros de sécurité sociale stockés dans la table, comme illustré dans l'exemple suivant :

EXEC sp_addtype SSN, 'VARCHAR(11)', 'NOT NULL'
GO
CREATE TABLE ShowSSNUsage (EmployeeID int PRIMARY KEY, EmployeeSSN SSN, CONSTRAINT CheckSSN CHECK ( EmployeeSSN LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' )
)
GO

Si les colonnes SSN sont généralement utilisées en tant que colonnes clés dans les index, en particulier dans les index cluster, la taille des clés peut être ramenée de 11 à 4 octets si le type de données SSN défini par l'utilisateur est appliqué en utilisant le type de données de base int. Cette réduction de la taille des clés améliore la récupération des données. Le fait que la récupération des données soit plus efficace et qu'il ne soit plus nécessaire d'utiliser la contrainte CHECK va généralement suffire à compenser le traitement supplémentaire requis pour convertir int dans un format caractère lors de l'affichage ou de la modification des valeurs SSN.