Section courante

A propos

Section administrative du site

Objets de base du SQL

Le langage de programmation du moteur de base de données du SQL Server, Transact-SQL, possède les mêmes fonctionnalités de base que les autres langages de programmation courants :

Valeurs littérales

Une valeur littérale est une constante alphanumérique, hexadécimale ou numérique. Une constante de chaîne de caractères contenant un ou plusieurs caractères d'un ensemble de caractères entourés de deux guillemets droits simples (' ') ou de guillemets droits doubles (" ") (les guillemets simples sont préférés en raison des multiples utilisations des guillemets doubles). Si vous souhaitez inclure un guillemet simple dans une chaîne de caractères délimitée par des guillemets simples, utilisez deux guillemets simples consécutifs dans la chaîne de caractères. Les constantes hexadécimales sont utilisées pour représenter des caractères non affichables et d'autres données binaires. Chaque constante hexadécimale commence par les caractères «0x» suivis d'un nombre pair de caractères ou de nombres. Les exemples suivent illustrent des constantes de chaîne de caractères valides et non valides et des constantes hexadécimales.

Exemples

Voici quelques constantes de chaîne de caractères et constantes hexadécimales valides :

'Sept-Iles'
"Quebec, Canada G1Q 1Q9"
'9876'

L'apostrophe (') s'affiche comme ceci : j''ai (notez les deux guillemets simples consécutifs).

0x53514C0D

Les éléments suivants ne sont pas des constantes de chaîne de caractères :

'AB'C' /* nombre impair de guillemets simples) */
'Nouveau Quebec" /* le même type de guillemets, simple ou double, doit être utilisé à chaque extrémité de la chaîne de caractères */

Les constantes numériques incluent toutes les valeurs entières, à virgule fixe et à virgule flottante avec et sans signes. Les constantes suivantes sont numériques :

130
-130.00
-0.357E5 /* notation scientifique - nEm signifie n multiplié par 10m)*/
22.3E-3

Une constante a toujours un type de données et une longueur, et les deux dépendent du format de la constante. De plus, chaque constante numérique a une précision et un facteur d'échelle.

Délimiteurs

Dans le Transact-SQL, les guillemets doubles ont deux significations. En plus des chaînes de caractères englobantes, les guillemets doubles peuvent également être utilisés comme délimiteurs pour les identificateurs dits délimités. Les identificateurs délimités sont un type spécial d'identificateur généralement utilisé pour permettre l'utilisation de mots-clefs réservés comme identificateurs et également pour autoriser des espaces dans les noms d'objets de base de données.

La différenciation entre guillemets simples et doubles a été introduite pour la première fois dans la norme SQL92. Dans le cas des identifiants, cette norme fait la différence entre les identifiants réguliers et délimités. Deux différences clefs sont que les identificateurs délimités sont placés entre guillemets doubles et sont sensibles à la casse. (Transact-SQL prend également en charge l'utilisation de crochets au lieu de guillemets doubles.) Les guillemets doubles ne sont utilisés que pour délimiter les chaînes de caractères. Généralement, des identificateurs délimités ont été introduits pour permettre la spécification d'identificateurs, étant par ailleurs identiques aux mots-clefs réservés. Concrètement, les identificateurs délimités vous protègent de l'utilisation de noms (identifiants, noms de variables) pouvant être introduits comme mots-clefs réservés dans l'un des futurs standards SQL. De plus, les identificateurs délimités peuvent contenir des caractères étant normalement illégaux dans les noms d'identificateurs, tels que des espaces.

Dans Transact-SQL, l'utilisation de guillemets doubles est définie à l'aide de l'option QUOTED_IDENTIFIER de l'instruction SET. Si cette option est définie sur ON, étant la valeur par défaut, un identificateur entre guillemets doubles sera défini comme identifiant délimité. Dans ce cas, les guillemets doubles ne peuvent pas être utilisés pour délimiter les chaînes de caractères.

Commentaires

Il existe deux manières différentes de spécifier un commentaire dans une instruction Transact-SQL. L'utilisation de la paire de caractères /* et */ marque le texte inclus en tant que commentaire. Dans ce cas, le commentaire peut s'étendre sur plusieurs lignes. De plus, les caractères -- (deux tirets) indiquent que le reste de la ligne courante est un commentaire. (Les deux tirets -- sont conformes à la norme ANSI SQL, tandis que /* et */ sont les extensions de Transact-SQL.)

Identificateurs

Dans le Transact-SQL, les identificateurs sont utilisés pour identifier les objets de base de données tels que les bases de données, les tables et les index. Ils sont représentés par des chaînes de caractères pouvant contenir jusqu'à 128 caractères et pouvant contenir des lettres, des chiffres ou les caractères suivants : _, @, # et $. Chaque nom doit commencer par une lettre ou l'un des caractères suivants : _, @ ou #. Le caractère # au début d'un nom de table ou de procédure entreposée désigne un objet temporaire, tandis que @ au début d'un nom désigne une variable. Comme indiqué précédemment, ces règles ne s'appliquent pas aux identifiants délimités (également appelés identifiants entre guillemets), pouvant contenir ou commencer par n'importe quel caractère (autre que les délimiteurs eux-mêmes).

Mots-clefs réservés

Chaque langage de programmation a un ensemble de noms avec des significations réservées, devant être écrits et utilisés dans le format défini. Les noms de ce type sont appelés mots-clefs réservés. Le Transact-SQL utilise une variété de ces noms, qui, comme dans de nombreux autres langages de programmation, ne peuvent pas être utilisés comme noms d'objets, à moins que les objets ne soient spécifiés comme des identificateurs délimités ou entre guillemets.

Dans le Transact-SQL, les noms de tous les types de données et fonctions système, tels que CHARACTER et INTEGER, ne sont pas des mots clefs réservés. Ils peuvent donc être utilisés pour désigner des objets. (N'utilisez pas de types de données et de fonctions système comme noms d'objets ! Une telle utilisation rend les instructions Transact-SQL difficiles à lire et à comprendre.)

Types de données

Toutes les valeurs de données d'une colonne doivent être du même type de données. (La seule exception spécifie les valeurs du type de données SQL_VARIANT.) Le Transact-SQL utilise différents types de données, pouvant être classés comme suit :

Types de données numériques

Les types de données numériques sont utilisés pour représenter des nombres. Le tableau suivant présente la liste de tous les types de données numériques :

Type de données Description
INTEGER Représente des valeurs entières pouvant être entreposées dans 4 octets. L'intervalle de valeurs est de -2 147 483 648 à 2 147 483 647. Le INT est la forme abrégée de INTEGER.
SMALLINT Représente des valeurs entières pouvant être entreposées dans 2 octets. L'intervalle de valeurs est de -32768 à 32767.
TINYINT Représente des valeurs entières non négatives pouvant être entreposées dans 1 octet. L'intervalle de valeurs est de 0 à 255.
BIGINT Représente des valeurs entières pouvant être entreposées dans 8 octets. L'intervalle de valeurs est de -263 à 263-1.
DECIMAL(p,[s]) Décrit les valeurs à virgule fixe. Le paramètre p (précision) spécifie le nombre total de chiffres avec une virgule décimale supposée s (échelle) chiffres à partir de la droite. Les valeurs DECIMAL sont entreposées, selon la valeur de p, dans 5 à 17 octets. Le DEC est la forme abrégée de DECIMAL.
NUMERIC(p,[s]) Décrit les valeurs à virgule fixe. Le paramètre p (précision) spécifie le nombre total de chiffres avec une virgule décimale supposée s (échelle) chiffres à partir de la droite. Les valeurs NUMERIC sont entreposées, selon la valeur de p, dans 5 à 17 octets. Le DEC est la forme abrégée de NUMERIC.
REAL Utilisé pour les valeurs à virgule flottante. La plage de valeurs positives est d'environ 2,23E - 308 à 1,79E + 308, et la plage de valeurs négatives est d'environ -1,18E - 38 à -1,18E + 38 (la valeur zéro peut également être entreposée).
FLOAT[(p)] Représente des valeurs à virgule flottante, comme REAL. p définit la précision avec p < 25 en simple précision (4 octets) et p >= 25 en double précision (8 octets).
MONEY Utilisé pour représenter des valeurs monétaires. Les valeurs MONEY correspondent à des valeurs DECIMAL de 8 octets et sont arrondies à quatre chiffres après la virgule.
SMALLMONEY Correspond au type de données MONEY mais est entreposé sur 4 octets.

Types de données de caractères

Il existe deux formes générales de types de données de caractères. Il peut s'agir de chaînes de caractères à un octet ou de chaînes de caractères Unicode. (Unicode utilise plusieurs octets pour spécifier un caractère.) De plus, les chaînes de caractères peuvent avoir une longueur fixe ou variable. Les types de données de caractères suivants sont utilisés :

Type de données Description
CHAR[(n)] Représente une chaîne de caractères de longueur fixe de caractères à un octet, où n est le nombre de caractères à l'intérieur de la chaîne de caractères. La valeur maximale de n est 8000. CHARACTER(n) est une forme équivalente supplémentaire pour CHAR(n). Si n est omis, la longueur de la chaîne de caractères est supposée être 1.
VARCHAR[(n)] Décrit une chaîne de caractères de longueur variable de caractères à un octet (0 < n 8000). Contrairement au type de données CHAR, les valeurs du type de données VARCHAR sont entreposées dans leur longueur réelle. Ce type de données a deux synonymes : CHAR VARYING et CHARACTER VARYING.
NCHAR[(n)] Entrepose des chaînes de longueur fixe de caractères Unicode. La principale différence entre les types de données CHAR et NCHAR est que chaque caractère du type de données NCHAR est entreposé dans 2 octets, tandis que chaque caractère du type de données CHAR utilise 1 octet d'espace d'entreposage. Par conséquent, le nombre maximal de caractères dans une colonne du type de données NCHAR est de 4000.
NVARCHAR[(n)] Entrepose des chaînes de longueur variable de caractères Unicode. La principale différence entre les types de données VARCHAR et NVARCHAR est que chaque caractère NVARCHAR est entreposé sur 2 octets, tandis que chaque caractère VARCHAR utilise 1 octet d'espace d'entreposage. Le nombre maximal de caractères dans une colonne du type de données NVARCHAR est de 4000.

Le type de données VARCHAR est identique au type de données CHAR à une différence près : si le contenu d'une chaîne de caractères CHAR(n) est plus court que n caractères, le reste de la chaîne de caractères est rempli d'espaces. (Une valeur du type de données VARCHAR est toujours entreposée dans sa longueur réelle.)

Types de données temporelles

Le Transact-SQL prend en charge les types de données temporels suivants :

Les types de données DATETIME et SMALLDATETIME spécifient une date et une heure, chaque valeur étant entreposée sous forme de valeur entière sur 4 ou 2 octets, respectivement. Les valeurs de DATETIME et SMALLDATETIME sont entreposées en interne sous forme de deux valeurs numériques distinctes. La valeur de date de DATETIME est entreposée dans l'intervalle 01/01/1753 au 31/12/9999. La valeur analogique de SMALLDATETIME est entreposée dans l'intervalle 01/01/1900 à 06/06/2079. La composante de temps est entreposé dans le deuxième champ de 4 octets (ou 2 octets pour SMALLDATETIME) en tant que nombre de trois centièmes de seconde (DATETIME) ou de minutes (SMALLDATETIME) qui se sont écoulées depuis minuit. L'utilisation de DATETIME et SMALLDATETIME est plutôt gênante si vous souhaitez entreposer uniquement la partie date ou la partie heure. Pour cette raison, le SQL Server 2008 introduit les nouveaux types de données DATE et TIME, entreposant uniquement le composant DATE ou TIME d'un DATETIME, respectivement. Le type de données DATE est entreposé sur 3 octets et s'étend du 01/01/0001 au 31/12/9999. Le type de données TIME est entreposé sur 3 à 5 octets et a une précision de 100 nanosecondes (ns). Le type de données DATETIME2 est également un nouveau type de données entreposant des données de date et d'heure de haute précision. Le type de données peut être défini pour des longueurs variables en fonction des besoins. (La taille de entreposage est de 6 à 8 octets). La précision de la partie temps est de 100 ns. Ce type de données ne connaît pas l'heure d'été. Tous les types de données temporelles décrits jusqu'à présent ne prennent pas en charge le fuseau horaire. Le nouveau type de données appelé DATETIMEOFFSET a la partie décalage de fuseau horaire. Pour cette raison, il est entreposé sur 6 à 8 octets. (Toutes les autres propriétés de ce type de données sont analogues aux propriétés correspondantes de DATETIME2.) La valeur de date dans Transact-SQL est spécifiée par défaut sous forme de chaîne de caractères dans un format tel que «mmm dd yyyy» (par exemple, «Jan 10 1993») entre deux guillemets simples ou doubles. (Notez que l'ordre relatif du mois, du jour et de l'année peut être contrôlé par l'instruction SET DATEFORMAT. De plus, le système reconnaît les valeurs de mois numériques avec des délimiteurs de / ou -.) De même, la valeur d'heure est spécifiée au format 'hh :mm' et le moteur de base de données utilise l'heure de 24 heures (23:24, par exemple).

Le Transact-SQL prend en charge une variété de formats d'entrée pour les valeurs datetime. Comme vous le savez déjà, les deux objets sont identifiés séparément ; ainsi, les valeurs de date et d'heure peuvent être spécifiées dans n'importe quel ordre ou seules. Si l'une des valeurs est omise, le système utilise les valeurs par défaut. (La valeur par défaut pour l'heure est 12:00 AM.)

Exemple

Les exemples suivants montrent les différentes manières dont les valeurs de date ou d'heure peuvent être écrites en utilisant les différents formats. Les descriptions de dates suivantes peuvent être utilisées :

'16/5/1974' /* avec SET DATEFORMAT dmy */
'May 16 1974'
'1974 MAY 16'

Les expressions de temps suivantes peuvent être utilisées :

'8:45 AM'
'4 pm'

Types de données divers

Le Transact-SQL prend en charge plusieurs types de données n'appartenant à aucun des groupes de types de données décrits précédemment :

Types de données binaires et BIT

Les BINARY et VARBINARY sont les deux types de données binaires. Ils décrivent des objets de données représentés dans le format interne du système. Ils sont utilisés pour entreposer des chaînes de caractères de bits. Pour cette raison, les valeurs sont saisies à l'aide de nombres hexadécimaux. Les valeurs du type de données BIT sont entreposées dans un seul bit. Par conséquent, jusqu'à 8 colonnes de bits sont entreposées dans 1 octet. Le tableau suivant résume les propriétés de ces types de données :

Type de données Description
BINARY[(n)] Spécifie une chaîne de bits de longueur fixe avec exactement n octets (0 < n ≤ 8000).
VARBINARY[(n)] Spécifie une chaîne de bits de longueur variable avec jusqu'à n octets (0 < n ≤ 8000).
BIT Utilisé pour spécifier le type de données booléen avec trois valeurs possibles : FALSE, TRUE et NULL.

Types de données d'objets volumineux

Les objets volumineux (LOB) sont des objets de données d'une longueur maximale de 2 Go. Ces objets sont généralement utilisés pour stocker des données texte volumineuses et pour charger des modules et des fichiers audio/vidéo. Transact-SQL prend en charge deux manières différentes de spécifier et d'accéder aux LOB :

Le spécificateur MAX

À partir de SQL Server 2005, vous pouvez utiliser le même modèle de programmation pour accéder aux valeurs des types de données et des LOB standard. En d'autres termes, vous pouvez utiliser des fonctions système et des opérateurs de chaîne de caractères pratiques pour travailler avec les LOB. Le moteur de base de données utilise le spécificateur MAX avec les types de données VARCHAR, NVARCHAR et VARBINARY pour définir des colonnes de longueur variable. Lorsque vous utilisez MAX par défaut (au lieu d'une valeur explicite), le système analyse la longueur de la chaîne de caractères particulière et décide s'il faut entreposer la chaîne de caractères en tant que valeur pratique ou en tant que LOB. Le spécificateur MAX indique que la taille des valeurs de colonne peut atteindre la taille LOB maximale du système actuel. (Dans une future version de SQL Server, il est possible que MAX ait une valeur maximale plus élevée pour les chaînes de caractères.) Bien que le système de base de données décide du mode d'entreposage d'un LOB, vous pouvez remplacer cette spécification par défaut à l'aide de la procédure système sp_tableoption avec l'option LARGE_VALUE_TYPES_OUT_OF_ROW. Si la valeur de l'option est définie sur 1, les données dans les colonnes déclarées à l'aide du spécificateur MAX seront entreposées séparément de toutes les autres données. Si cette option est définie sur 0, le moteur de base de données entrepose toutes les valeurs pour la taille de ligne < 8060 octets en tant que données de ligne normales. Dans SQL Server 2008, vous pouvez appliquer le nouvel attribut FILESTREAM à une colonne VARBINARY(MAX) pour entreposer des données binaires volumineuses directement dans un système de fichiers NTFS. Le principal avantage de cet attribut est que la taille du LOB correspondant n'est limitée que par la taille du volume du système de fichiers.

Types de données TEXT, NTEXT et IMAGE

Les types de données TEXT, NTEXT et IMAGE constituent les types de données dits texte/image. Les objets de données du type IMAGE peuvent contenir n'importe quel type de données (modules de chargement, audio/vidéo), tandis que les objets de données des types de données TEXT et NTEXT peuvent contenir n'importe quelle donnée texte (c'est-à-dire des données affichables). Les types de données text/image sont entreposés par défaut séparément de toutes les autres valeurs d'une base de données à l'aide d'une structure B-tree pointant vers les fragments de ces données. (Une structure B-tree est une structure de données arborescente dans laquelle tous les noeuds inférieurs sont au même nombre de niveaux à partir de la racine de l'arbre.) Pour les colonnes d'un type de données texte/image, le moteur de base de données entrepose un pointeur dans la ligne de données spécifiant où les données peuvent être trouvées. Si la quantité de données texte/image est inférieure à 32 Ko, le pointeur pointe vers le noeud racine de la structure B-tree, faisant 84 octets. Le noeud racine pointe vers les blocs physiques des données. Si la quantité de données est supérieure à 32 Ko, le moteur de base de données crée des noeuds intermédiaires entre les blocs de données et le noeud racine. Pour chaque table contenant plus d'une colonne avec de telles données, toutes les valeurs des colonnes sont entreposées ensemble. Cependant, une page physique ne peut contenir que des données texte/image d'une seule table.

Bien que les données texte/image soient entreposées séparément de toutes les autres données, vous pouvez les modifier à l'aide de la procédure système sp_tableoption avec l'option TEXT_IN_ROW. En utilisant cette option, vous pouvez spécifier le nombre maximum d'octets, étant entreposés avec les données régulières. Les types de données texte/image discutés jusqu'ici ont plusieurs limitations. Vous ne pouvez pas les utiliser comme variables locales (dans des procédures entreposées ou dans des groupes d'instructions Transact-SQL). De plus, ils ne peuvent pas faire partie d'un index ou ne peuvent pas être utilisés dans les clauses suivantes de l'instruction SELECT : WHERE, ORDER BY et GROUP BY. Le plus gros problème concernant tous les types de données texte/image est que vous devez utiliser des opérateurs spéciaux (READTEXT, WRITETEXT et UPDATETEXT) pour travailler avec de telles données.

Les types de données texte/image sont marqués comme une fonctionnalité obsolète et seront supprimés dans une future version du moteur de base de données. Utilisez plutôt VARCHAR(MAX), NVARCHAR(MAX) et VARBINARY(MAX).

Type de données UNIQUEIDENTIFIER

Comme son nom l'indique, une valeur du type de données UNIQUEIDENTIFIER est un numéro d'identification unique entreposé sous forme de chaîne de caractères binaire de 16 octets. Ce type de données est étroitement lié à l'identifiant global unique (GUID), garantissant l'unicité dans le monde entier. Par conséquent, en utilisant ce type de données, vous pouvez identifier de manière unique les données et les objets dans les systèmes distribués. L'initialisation d'une colonne ou d'une variable de type UNIQUEIDENTIFIER peut être assurée à l'aide des fonctions NEWID et NEWSEQUENTIALID, ainsi qu'avec une constante chaîne de caractères écrite sous une forme spéciale utilisant des chiffres hexadécimaux et des tirets. Une colonne du type de données UNIQUEIDENTIFIER peut être référencée à l'aide du mot clef ROWGUIDCOL dans une requête pour spécifier que la colonne contient des valeurs d'ID. (Ce mot-clef ne génère aucune valeur.) Une table peut avoir plusieurs colonnes de type UNIQUEIDENTIFIER, mais une seule d'entre elles peut avoir le mot-clef ROWGUIDCOL.

Type de données SQL_VARIANT

Le type de données SQL_VARIANT peut être utilisé pour entreposer simultanément des valeurs de différents types de données, telles que des valeurs numériques, des chaînes de caractères et des valeurs de date. (Les seuls types de valeurs ne pouvant pas être entreposés sont les valeurs TIMESTAMP.) Chaque valeur d'une colonne SQL_VARIANT comporte deux parties : la valeur des données et les informations décrivant la valeur. (Ces informations contiennent toutes les propriétés du type de données réel de la valeur, telles que la longueur, l'échelle et la précision.) Le Transact-SQL prend en charge la fonction SQL_VARIANT_PROPERTY, affichant les informations jointes pour chaque valeur d'une colonne SQL_VARIANT.

Déclarez une colonne d'une table à l'aide du type de données SQL_VARIANT uniquement si cela est vraiment nécessaire. Une colonne doit avoir ce type de données si ses valeurs peuvent être de types différents ou s'il n'est pas possible de déterminer le type d'une colonne pendant le processus de conception de la base de données.

Type de données HIERARCHYID

Le type de données HIERARCHYID est utilisé pour entreposer une hiérarchie entière. Il est mise en oeuvre en tant que type défini par l'utilisateur CLR (Common Language Runtime) comprenant plusieurs fonctions système pour créer et opérer sur des noeuds de hiérarchie. Les fonctions suivantes, entre autres, appartiennent aux méthodes de ce type de données : GetAncestor(), GetDescendant(), Read() et Write().

Type de données TIMESTAMP

Le type de données TIMESTAMP spécifie une colonne définie comme VARBINARY(8) ou BINARY(8), selon la capacité NULL de la colonne. Le système conserve une valeur actuelle (pas une date ou une heure) pour chaque base de données, qu'il incrémente chaque fois qu'une ligne avec une colonne TIMESTAMP est insérée ou mise à jour et définit la colonne TIMESTAMP sur cette valeur. Ainsi, les colonnes TIMESTAMP peuvent être utilisées pour déterminer l'heure relative à laquelle les lignes ont été modifiées pour la dernière fois. (ROWVERSION est un synonyme de TIMESTAMP.)

La valeur entreposée dans une colonne TIMESTAMP n'est pas importante en soi. Cette colonne est généralement utilisée pour détecter si une ligne spécifique a été modifiée depuis le dernier accès.

DECIMAL avec format d'entreposage VARDECIMAL

Le type de données DECIMAL est généralement entreposé sur le disque sous forme de données de longueur fixe. Depuis SQL Server 2005 SP2, ce type de données peut être entreposé sous forme de colonne de longueur variable à l'aide du nouveau format d'entreposage appelé VARDECIMAL. En utilisant VARDECIMAL, vous pouvez réduire considérablement l'espace d'entreposage pour une colonne DECIMAL dans laquelle les valeurs ont une différence significative dans leurs longueurs.

Le VARDECIMAL est un format d'entreposage et non un type de données. Le format d'entreposage VARDECIMAL fonctionne de la même manière pour le type de données DECIMAL que le type de données VARCHAR pour les données alphanumériques.

Le format d'entreposage VARDECIMAL est utile lorsque vous devez spécifier la plus grande valeur possible pour un champ dans lequel les valeurs entreposées sont généralement beaucoup plus petites. Le tableau suivant le montre :

Précision Nombre d'octets : VARDECIMAL Nombre d'octets: Longueur fixe
0 ou NULL 2 5
1 4 5
20 12 13
30 16 17
38 20 17

Pour activer le format d'entreposage VARDECIMAL, vous devez d'abord l'activer pour la base de données, puis l'activer pour la table particulière de cette base de données. La procédure système sp_db_vardecimal_storage_format est utilisée pour la première étape, comme le montre l'exemple suivant :

EXEC sp_db_vardecimal_storage_format 'sample', 'ON';

L'option VARDECIMAL STORAGE FORMAT de la procédure système de l'option sp_table est utilisée pour activer cet entreposage pour la table. L'exemple suivant active le format d'entreposage VARDECIMAL pour la table de projet :

EXEC sp_tableoption 'project', 'vardecimal storage format', 1

Comme vous le savez déjà, la principale raison d'utiliser le format d'entreposage VARDECIMAL est de réduire la taille d'entreposage des données. Si vous souhaitez tester la quantité d'espace d'entreposage pouvant être gagnée en utilisant ce format d'entreposage, utilisez la vue de gestion dynamique appelée sys.sp_estimated_rowsize_reduction_for_vardecimal. Cette vue de gestion dynamique vous donne une estimation détaillée pour la table particulière.

Fonctions Transact-SQL

Les fonctions Transact-SQL peuvent être des fonctions d'agrégat ou des fonctions scalaires.

Fonctions d'agrégation

Les fonctions d'agrégat sont appliquées à un groupe de valeurs de données d'une colonne. Les fonctions d'agrégat renvoient toujours une valeur unique. Le Transact-SQL prend en charge plusieurs groupes de fonctions d'agrégation :

Voici les fonctions agrégats statistiques et analytiques les plus pratiques :

Fonction Description
AVG Calcule la moyenne arithmétique (moyenne) des valeurs de données contenues dans une colonne. La colonne doit contenir des valeurs numériques.
MAX et MIN Calcule respectivement la valeur de données maximale et minimale de la colonne. La colonne peut contenir des valeurs numériques, de chaîne de caractères et de date/heure.
SUM Calcule le total de toutes les valeurs de données dans une colonne. La colonne doit contenir des valeurs numériques.
COUNT Calcule le nombre de valeurs de données (non nulles) dans une colonne. La seule fonction d'agrégation n'étant pas appliquée aux colonnes est COUNT(*). Cette fonction renvoie le nombre de lignes (que des colonnes particulières aient ou non des valeurs NULL).
COUNT_BIG Analogue à COUNT, la seule différence étant que COUNT_BIG renvoie une valeur du type de données BIGINT.

Fonctions scalaires

En plus des fonctions d'agrégation, le Transact-SQL fournit plusieurs fonctions scalaires utilisées dans la construction d'expressions scalaires. (Une fonction scalaire opère sur une seule valeur ou liste de valeurs, par opposition aux fonctions d'agrégation, opérant sur les données de plusieurs lignes.) Les fonctions scalaires peuvent être classées comme suit :

Fonctions numériques

Les fonctions numériques dans Transact-SQL sont des fonctions mathématiques permettant de modifier des valeurs numériques. Les fonctions numériques suivantes sont disponibles :

Fonction Description
ABS(n) Renvoie la valeur absolue (c'est-à-dire que les valeurs négatives sont renvoyées comme positives) de l'expression numérique n. Exemple :

SELECT ABS(-5.767) = 5.767, SELECT ABS(6.384) = 6.384
ACOS(n) Calcule l'arc cosinus de n. n et la valeur résultante appartiennent au type de données FLOAT.
ASIN(n) Calcule l'arc sinus de n. n et la valeur résultante appartiennent au type de données FLOAT.
ATAN(n) Calcule l'arc tangente de n. n et la valeur résultante appartiennent au type de données FLOAT.
ATN2(n,m) Calcule l'arc tangente de n/m. n, m et la valeur résultante appartiennent au type de données FLOAT.
CEILING(n) Renvoie la plus petite valeur entière supérieure ou égale au paramètre spécifié. Exemples :

SELECT CEILING(4.88) /* = 5 */
SELECT CEILING(-4.88) /* = -4 */
COS(n) Calcule le cosinus de n. Le n et la valeur résultante appartiennent au type de données FLOAT.
COT(n) Calcule la cotangente de n. Le n et la valeur résultante appartiennent au type de données FLOAT.
DEGREES(n) Convertit les radians en degrés. Exemples :

SELECT DEGREES(PI()/2) /* = 90.0 */
SELECT DEGREES(0.75) /* = 42.97 */
EXP(n) Calcule la valeur en. Exemple :

SELECT EXP(1) /* = 2.7183 */
FLOOR(n) Calcule la plus grande valeur entière inférieure ou égale à la valeur spécifiée n. Exemple :

SELECT FLOOR(4.88) /* = 4 */
LOG(n) Calcule le logarithme naturel (c'est-à-dire en base e) de n. Exemples :

SELECT LOG(4.67) /* = 1.54 */ SELECT LOG(0.12) /* = -2.12 */
LOG10(n) Calcule le logarithme (base 10) pour n. Exemples :

SELECT LOG10(4.67) /* = 0.67 */
SELECT LOG10(0.12) /* = -0.92 */
PI() Renvoie la valeur du nombre π (3.14).
POWER(x,y) Calcule la valeur xy. Exemples :

SELECT POWER(3.12,5) /* = 295.65 */ SELECT POWER(81,0.5) /* = 9 */
RADIANS(n) Convertit les degrés en radians. Exemples :

SELECT RADIANS(90.0) /* = 1.57 */
SELECT RADIANS(42.97) /* = 0.75 */
RAND Renvoie un nombre aléatoire compris entre 0 et 1 avec un type de données FLOAT.
ROUND(n, p,[t]) Arrondit la valeur du nombre n en utilisant la précision p. Utilisez des valeurs positives de p pour arrondir à droite de la virgule décimale et utilisez des valeurs négatives pour arrondir à gauche. Un paramètre facultatif t provoque la troncature de n. Exemples :

SELECT ROUND(5.4567,3) /* = 5.4570 */
SELECT ROUND(345.4567,-1) /* = 350.0000 */
SELECT ROUND(345.4567,-1,1) /* = 340.0000*/
ROWCOUNT_BIG Renvoie le nombre de lignes ayant été affectées par la dernière instruction Transact-SQL exécutée par le système. La valeur de retour de cette fonction a le type de données BIGINT.
SIGN(n) Renvoie le signe de la valeur n sous forme de nombre (+1 pour positif, -1 pour négatif et 0 pour zéro). Exemple :

SELECT SIGN(0.88) /* = 1 */
SIN(n) Calcule le sinus de n. n et la valeur résultante appartiennent au type de données FLOAT.
SQRT(n) Calcule la racine carrée de n. Exemple :

SELECT SQRT(9) /* = 3 */
SQUARE(n) Renvoie le carré de l'expression donnée. Exemple :

SELECT SQUARE(9) /* = 81 */
TAN(n) Calcule la tangente de n. n et la valeur résultante appartiennent au type de données FLOAT.

Fonctions de date

Les fonctions de date calculent la partie date ou heure respective d'une expression ou renvoient la valeur à partir d'un intervalle de temps. Le Transact-SQL prend en charge les fonctions de date suivantes :

Fonction Description
GETDATE() Renvoie la date et l'heure actuelles du système. Exemple :

SELECT GETDATE() /* = 2008-01-01 13:03:31.390 */
DATEPART(item,date) Renvoie l'élément de partie spécifié d'une date date sous forme d'entier. Exemples :

SELECT DATEPART(month, '01.01.2005') /* = 1 (1 = Janvier) */
SELECT DATEPART(weekday, '01.01.2005') /* = 7 (7 = Dimanche ) */
DATENAME(item,date) Renvoie l'élément de partie spécifié de la date date sous forme de chaîne de caractères. Exemple :

SELECT DATENAME(weekday, '01.01.2005') /* = Dimanche */
DATEDIFF(item,dat1,dat2) Calcule la différence entre les deux parties de date dat1 et dat2 et renvoie le résultat sous forme d'entier dans les unités spécifiées par l'élément de valeur. Exemple :

SELECT DATEDIFF(year, BirthDate, GETDATE()) AS age FROM employee /* renvoie l'âge de chaque employé. */
DATEADD(i,n,d) Ajoute le nombre n d'unités spécifié par la valeur i à la date donnée d. Exemple :

SELECT DATEADD(DAY,3,HireDate) AS age FROM employee /* ajoute trois jours à la date de début d'emploi de chaque employé. */

Fonctions de chaîne de caractères

Les fonctions de chaîne de caractères sont utilisées pour manipuler les valeurs de données dans une colonne, généralement de type caractère. Le Transact-SQL prend en charge les fonctions de chaîne de caractères suivantes :

Fonction Description
ASCII(character) Convertit le caractère spécifié en code entier équivalent (ASCII). Renvoie un entier. Exemple :

SELECT ASCII('A') /* = 65 */
CHAR(integer) Convertit le code ASCII en caractère équivalent. Exemple :

SELECT CHAR(65) /* = 'A' */
CHARINDEX(z1,z2) Renvoie la position de départ où la chaîne de caractères partielle z1 apparaît pour la première fois dans la chaîne de caractères z2. Renvoie 0 si z1 ne se produit pas dans z2. Exemple :

SELECT CHARINDEX('bl', 'table') /* = 3 */
DIFFERENCE(z1,z2) Renvoie un entier, de 0 à 4, correspondant à la différence des valeurs SOUNDEX de deux chaînes de caractères z1 et z2. (SOUNDEX renvoie un nombre qui spécifie le son d'une chaîne. Avec cette méthode, des chaînes de caractères avec des sons similaires peuvent être déterminées.) Exemple :

SELECT DIFFERENCE('spelling', 'telling') /* = 2 (semble un peu similaire, 0 = ne semble pas similaire) */
LEFT(z, length) Renvoie les premiers caractères de longueur de la chaîne de caractères z.
LEN(z) Renvoie le nombre de caractères, au lieu du nombre d'octets, de l'expression de chaîne spécifiée, à l'exclusion des blancs de fin.
LOWER(z1) Convertit toutes les lettres majuscules de la chaîne de caractères z1 en lettres minuscules. Les lettres minuscules, les chiffres et les autres caractères ne changent pas. Exemple :

SELECT LOWER('GRoS') /* = 'gros' */
LTRIM(z) Supprime les blancs de début dans la chaîne de caractères z. Exemple :

SELECT LTRIM(' Chaine') */ = 'Chaine' */
NCHAR(i) Renvoie le caractère de caractères Unicode avec le code entier spécifié, tel que défini par la norme Unicode.
QUOTENAME(char_string) Renvoie une chaîne de caractères Unicode avec les délimiteurs ajoutés pour faire de la chaîne de caractères d'entrée un identificateur délimité valide.
PATINDEX(%p%,expr) Renvoie la position de départ de la première occurrence d'un motif p dans une expression spécifiée expr, ou des zéros si le motif n'est pas trouvé. Exemples :

SELECT PATINDEX('%gs%', 'longstring') /* = 4 */
SELECT RIGHT(ContactName, LEN(ContactName)-PATINDEX('% %',ContactName)) AS First_name FROM Customers /* Renvoie tous les prénoms de la colonne clients. */
REPLACE(str1,str2,str3) Remplace toutes les occurrences de str2 dans str1 par str3. Exemple :

SELECT REPLACE('shave' , 's' , 'be') /* = behave */
REPLICATE(z,i) Répète la chaîne de caractères z un i de fois. Exemple :

SELECT REPLICATE('s',10) /* = 'ssssssssss' */
REVERSE(z) Affiche la chaîne de caractères z dans l'ordre inverse. Exemple :

SELECT REVERSE('calculate') /* = 'etaluclac' */
RIGHT(z,length) Renvoie les derniers caractères de longueur de la chaîne de caractères z. Exemple :

SELECT RIGHT('Notebook',4) /* = 'book' */
RTRIM(z) Supprime les blancs de fin de la chaîne de caractères z. Exemple :

SELECT RTRIM('Gladir ') /* = 'Gladir' */
SOUNDEX(a) Renvoie un code SOUNDEX à quatre caractères pour déterminer la similitude entre deux chaînes de caractères. Exemple :

SELECT SOUNDEX('gladir.com') /* = G436 */
SPACE(length) Renvoie une chaîne de caractères avec des espaces de longueur spécifiée par longueur. Exemple :

SELECT SPACE = ' '
STR(f,[len [,d]]) Convertit l'expression flottante spécifiée f en une chaîne de caractères. len est la longueur de la chaîne de caractères incluant la virgule décimale, le signe, les chiffres et les espaces (10 par défaut), et d est le nombre de chiffres à droite de la virgule décimale à renvoyer. Exemple :

SELECT STR(3.45678,4,2) /* = '3.46' */
STUFF(z1,a,length,z2) Remplace la chaîne de caractères partielle z1 par la chaîne de caractères partielle z2 commençant à la position a, remplaçant les caractères de longueur de z1. Exemples :

SELECT STUFF('Notebook',5,0, ' dans un ') /* 'Note dans un book' */
SELECT STUFF('Notebook',1,4, 'Hand') /* = 'Handbook' */
SUBSTRING(z,a,length) Crée une chaîne de caractères partielle à partir de la chaîne de caractères z en commençant à la position a avec une longueur de longueur. Exemple :

SELECT SUBSTRING('gladir.com',1,6) /* = 'gladir' */
UNICODE Renvoie la valeur entière, telle que définie par la norme Unicode, pour le premier caractère de l'expression d'entrée.
UPPER(z) Convertit toutes les lettres minuscules de la chaîne de caractères z en lettres majuscules. Les majuscules et les chiffres ne changent pas. Exemple :

SELECT UPPER('minUSCule') /* = 'MINUSCULE' */

Fonctions du système

Les fonctions système de Transact-SQL fournissent des informations détaillées sur les objets de base de données. La plupart des fonctions système utilisent un identificateur numérique (ID) interne, étant attribué à chaque objet de base de données par le système lors de sa création. En utilisant cet identifiant, le système peut identifier de manière unique chaque objet de la base de données. Les fonctions système fournissent des informations sur le système de base de données. Le tableau suivant décrit plusieurs fonctions du système :

Fonction Description
CAST(a AS type [(length)] Convertit une expression a dans le type de type de données spécifié (si possible). Le paramètre a pourrait être n'importe quelle expression valide. Exemple :

SELECT CAST(3000000000 AS BIGINT) /* = 3000000000 */
COALESCE(a1,a2,..) Renvoie pour une liste donnée d'expressions a1, a2,... la valeur de la première expression n'étant pas NULL.
COL_LENGTH(obj,col) Renvoie la longueur de la colonne col appartenant à l'objet de base de données (de table ou de vue) obj. Exemple :

SELECT COL_LENGTH('customers', 'cust_ID') /* = 10 */
CONVERT(type[(length)],a) Équivalent à CAST, mais les paramètres sont spécifiés différemment. CONVERT peut être utilisé avec n'importe quel type de données.
CURRENT_TIMESTAMP Renvoie la date et l'heure actuelles. Exemple :

SELECT CURRENT_TIMESTAMP = '2008-01-01 17:22:55.670'
CURRENT_USER Renvoie le nom de l'utilisateur actuel.
DATALENGTH(z) Calcule la longueur (en octets) du résultat de l'expression z. Exemple :

SELECT DATALENGTH(ProductName) FROM products /* Cette requête renvoie la longueur de chaque champ. */
GETANSINULL('dbname') Renvoie 1 si l'utilisation de valeurs NULL dans le nom de base de données est conforme à la norme SQL ANSI. Exemple :

SELECT GETANSINULL('AdventureWorks') = 1
ISNULL(expr, value) Renvoie la valeur de expr si cette valeur n'est pas nulle ; sinon, il renvoie la valeur value.
ISNUMERIC(expression) Détermine si une expression est un type numérique valide.
NEWID() Crée un numéro d'identification unique composé d'une chaîne de caractères binaire de 16 octets destinée à entreposer des valeurs du type de données UNIQUEIDENTIFIER.
NEWSEQUENTIALID() Crée un GUID supérieur à tout GUID précédemment généré par cette fonction sur un ordinateur spécifié. (Cette fonction ne peut être utilisée que comme valeur par défaut pour une colonne.)
NULLIF(expr1,expr2) Renvoie la valeur NULL si les expressions expr1 et expr2 sont égales. Exemple :

SELECT NULLIF(project_no, 'p1') FROM projects /* La requête renvoie NULL pour le projet avec project_no = 'p1' */
SERVERPROPERTY(propertyname) Renvoie les informations de propriété sur le serveur de base de données.
SYSTEM_USER Renvoie l'ID de connexion de l'utilisateur actuel. Exemple :

SELECT SYSTEM_USER /* = DEMONAMD2019\Administrateur */
USER_ID([user_name]) Renvoie l'identificateur de l'utilisateur user_name. Si aucun nom n'est spécifié, l'identifiant de l'utilisateur courant est récupéré. Exemple :

SELECT USER_ID('guest') /* = 2 */
USER_NAME([id]) Renvoie le nom de l'utilisateur avec l'identificateur id. Si aucun nom n'est spécifié, le nom de l'utilisateur actuel est récupéré. Exemple :

SELECT USER_NAME = 'guest'

Toutes les fonctions de chaîne de caractères peuvent être imbriquées dans n'importe quel ordre ; par exemple, INVERSE(CURRENT_USER).

Fonctions de métadonnées

Généralement, les fonctions de métadonnées renvoient des informations concernant la base de données et les objets de base de données spécifiés. Le tableau suivant décrit plusieurs fonctions de métadonnées :

Fonction Description
COL_NAME(tab_id, col_id) Renvoie le nom d'une colonne appartenant à la table avec l'ID tab_id et l'ID de colonne col_id. Exemple :

SELECT COL_NAME(OBJECT_ID('employee') , 3) = 'emp_lname'
COLUMNPROPERTY(id, col, property) Renvoie les informations sur la colonne spécifiée. Exemple :

SELECT COLUMNPROPERTY(object_id('project'), 'project_no', 'PRECISION') = 4
DATABASEPROPERTY(database, property) Renvoie la valeur de propriété de base de données nommée pour la base de données et la propriété spécifiées. Exemple :

SELECT DATABASEPROPERTY('sample', 'IsNullConcat') /* = 0. (La propriété IsNullConcat correspond à l'option CONCAT_NULL_YIELDS_NULL.) */
DB_ID([db_name]) Renvoie l'identificateur de la base de données nom_bd. Si aucun nom n'est spécifié, l'identificateur de la base de données courante est renvoyé. Exemple :

SELECT DB_ID('Gladir') /* = 7 */
DB_NAME([db_id]) Renvoie le nom de la base de données avec l'identificateur db_id. Si aucun identificateur n'est spécifié, le nom de la base de données courante est affiché. Exemple :

SELECT DB_NAME(7) = 'Gladir'
INDEX_COL(table, i, no) Renvoie le nom de la colonne indexée dans la table table, défini par l'identificateur d'index i et le numéro de position de la colonne dans l'index.
INDEXPROPERTY(obj_id, index_name, property) Renvoie la valeur de propriété d'index ou de statistiques nommée d'un numéro d'identification de table, d'un nom d'index ou de statistiques et d'un nom de propriété spécifiés.
OBJECT_NAME(obj_id) Renvoie le nom de l'objet de base de données avec l'identificateur obj_id. Exemple :

SELECT OBJECT_NAME(453576654) = 'products'
OBJECT_ID(obj_name) Renvoie l'identificateur de l'objet de base de données obj_name. Exemple :

SELECT OBJECT_ID('products') /* = 453576654 */
OBJECTPROPERTY(obj_id,property) Renvoie les informations sur les objets de la base de données actuelle.

Opérateurs scalaires

Les opérateurs scalaires sont utilisés pour les opérations avec des valeurs scalaires. Le Transact-SQL prend en charge les opérateurs numériques et booléens ainsi que la concaténation. Il existe des opérateurs arithmétiques unaires et binaires. Les opérateurs unaires sont + et - (comme signes). Les opérateurs arithmétiques binaires sont +, -, *, / et %. (Les quatre premiers opérateurs binaires ont leurs significations mathématiques respectives, tandis que % est l'opérateur modulo.) Les opérateurs booléens ont deux notations différentes selon qu'ils sont appliqués à des chaînes de bits ou à d'autres types de données. Les opérateurs NOT, AND et OR sont appliqués à tous les types de données (sauf BIT). Les opérateurs au niveau du bit pour manipuler les chaînes de bits sont répertoriés ici,

Opérateur Description
? Complément (exemple, NOT)
& Conjonction de chaînes de bits (c'est-à-dire AND)
| Disjonction des chaînes de bits (c'est-à-dire OR)
^ Disjonction exclusive (c'est-à-dire XOR ou Exclusive OR)

et l'exemple suivant montre comment ils sont utilisés :

~(1001001) = (0110110)
(11001001) | (10101101) = (11101101)
(11001001) & (10101101) = (10001001)
(11001001) ^ (10101101) = (01100100)

L'opérateur de concaténation + peut être utilisé pour concaténer deux chaînes de caractères ou chaînes de bits.

Variables globales

Les variables globales sont des variables système spéciales pouvant être utilisées comme s'il s'agissait de constantes scalaires. Le Transact-SQL prend en charge de nombreuses variables globales, devant être précédées du préfixe @@. Le tableau suivant décrit plusieurs variables globales. Elles sont également considéré comme des fonctions.

Variable Description
@@CONNECTIONS Renvoie le nombre de tentatives de connexion depuis le démarrage du système.
@@CPU_BUSY Renvoie le temps du microprocesseur total (en unités de millisecondes) utilisé depuis le démarrage du système.
@@ERROR Renvoie les informations sur la valeur de retour de la dernière instruction Transact-SQL exécutée.
@@IDENTITY Renvoie la dernière valeur insérée pour la colonne avec la propriété IDENTITY.
@@LANGID Renvoie l'identificateur de la langue actuellement utilisée par le système de base de données.
@@LANGUAGE Renvoie le nom de la langue actuellement utilisée par le système de base de données.
@@MAX_CONNECTIONS Renvoie le nombre maximum de connexions réelles au système.
@@PROCID Renvoie l'identificateur de la procédure entreposée en cours d'exécution.
@@ROWCOUNT Renvoie le nombre de lignes ayant été affectées par la dernière instruction Transact-SQL exécutée par le système.
@@SERVERNAME Récupère les informations concernant le serveur de base de données local. Ces informations contiennent, entre autres, le nom du serveur et le nom de l'instance.
@@SPID Renvoie l'identificateur du processus serveur.
@@VERSION Renvoie la version actuelle du logiciel du système de base de données.

Valeurs NULL

Une valeur NULL est une valeur spéciale pouvant être affectée à une colonne. Cette valeur est normalement utilisée lorsque les informations d'une colonne sont inconnues ou non applicables. Par exemple, dans le cas d'un numéro de téléphone résidentiel inconnu pour un employé d'une entreprise, il est recommandé d'affecter la valeur NULL à la colonne home_telephone. Toute expression arithmétique entraîne une valeur NULL si l'un des opérandes de cette expression est lui-même une valeur NULL. Par conséquent, dans les expressions arithmétiques unaires (si A est une expression avec une valeur NULL), à la fois +A et -A renvoient NULL. Dans les expressions binaires, si l'un (ou les deux) des opérandes A ou B a la valeur NULL, A + B, A - B, A * B, A / B et A % B donnent également un NULL. (Les opérandes A et B doivent être des expressions numériques.) Si une expression contient une opération relationnelle et qu'un (ou les deux) des opérandes a (ont) la valeur NULL, le résultat de cette opération sera NULL. Par conséquent, chacune des expressions A = B, A <> B, A < B et A > B renvoie également NULL. Dans les booléens AND, OR et NOT, le comportement des valeurs NULL est spécifié par les tables de vérité suivantes, où T signifie vrai, U pour inconnu (NULL) et F pour faux. Dans ces tableaux, suivez la ligne et la colonne représentées par les valeurs des expressions booléennes sur lesquelles l'opérateur travaille, et la valeur où elles se croisent représente la valeur résultante :

ET (AND) T U F
T (Vrai) T (Vrai) U (Nulle) F (Faux)
U (Nulle) U (Nulle) U (Nulle) F (Vrai)
F (Faux) F (Faux) F (Faux) F (Faux)
OU (OR) T (Vrai) U (Nulle) F (Faux)
T (Vrai) T (Vrai) T (Vrai) T (Vrai)
U (Nulle) T (Vrai) U (Nulle) U (Nulle)
F (Faux) T (Vrai) U (Nulle) F (Faux)
Pas (NOT)
T (Vrai) F (Faux)  
U (Nulle) U (Nulle)  
F (Faux) T (Vrai)  

Toute valeur NULL dans le paramètre des fonctions d'agrégation AVG, SUM, MAX, MIN et COUNT est éliminée avant le calcul de la fonction respective (à l'exception de la fonction COUNT(*)). Si une colonne ne contient que des valeurs NULL, la fonction renvoie NULL. La fonction d'agrégation COUNT(*) gère toutes les valeurs NULL de la même manière que les valeurs non NULL. Si la colonne ne contient que des valeurs NULL, le résultat de la fonction COUNT(DISTINCT column_name) est 0. Une valeur NULL doit être différente de toutes les autres valeurs. Pour les types de données numériques, il existe une distinction entre la valeur zéro et NULL. Il en est de même pour la chaîne de caractères vide et NULL pour les types de données caractère. Une colonne d'une table autorise les valeurs NULL si sa définition contient explicitement NULL. En revanche, les valeurs NULL ne sont pas autorisées si la définition d'une colonne contient explicitement NOT NULL. Si l'utilisateur ne spécifie pas NULL ou NOT NULL pour une colonne avec un type de données (sauf TIMESTAMP), les valeurs suivantes sont attribuées :

Si l'instruction SET n'est pas activée, une colonne contiendra la valeur NOT NULL par défaut. (Les colonnes de type de données TIMESTAMP ne peuvent être déclarées que comme colonnes NOT NULL.) Il existe également une autre option de l'instruction SET : CONCAT_NULL_YIELDS_NULL. Cette option influence l'opération de concaténation avec une valeur NULL afin que tout ce que vous concaténez à une valeur NULL produise à nouveau NULL. Par exemple :

'Sept Iles' + NULL = NULL

Dernière mise à jour : Mercredi, le 23 juin 2021