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 (également appelées constantes)
- Délimiteurs
- Commentaires
- Identificateurs
- Mots-clefs réservés
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
- Types de données de caractère
- Types de données temporelles (date et/ou heure)
- Divers types de données
- DECIMAL avec type d'entreposage VARDECIMAL
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 :
- DATETIME
- SMALLDATETIME
- DATE
- TIME
- DATETIME2
- DATETIMEOFFSET
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
- BIT
- Types de données d'objets volumineux
- CURSOR
- UNIQUEIDENTIFIER
- SQL_VARIANT
- TABLE
- XML
- Types de données spatiales (par exemple, GEOGRAPHY et GEOMETRY).
- HIERARCHYID
- Type de données TIMESTAMP
- Types de données définis par l'utilisateur
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 :
- Utilisez les types de données VARCHAR(MAX), NVARCHAR(MAX) et VARBINARY(MAX)
- Utilisez le type de données dit texte/image
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 :
- Fonctions d'agrégation pratiques
- Fonctions statistiques d'agrégation
- Fonctions d'agrégat définies par l'utilisateur
- Fonctions d'agrégation analytique
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
- Fonctions de date
- Fonctions de chaîne de caractères
- Fonctions système
- Fonctions de métadonnées
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 :
|
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 :
|
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 :
|
EXP(n) | Calcule la valeur en. Exemple :
|
FLOOR(n) | Calcule la plus grande valeur entière inférieure ou égale à la valeur spécifiée n. Exemple :
|
LOG(n) | Calcule le logarithme naturel (c'est-à-dire en base e) de n. Exemples :
|
LOG10(n) | Calcule le logarithme (base 10) pour n. Exemples :
|
PI() | Renvoie la valeur du nombre π (3.14). |
POWER(x,y) | Calcule la valeur xy. Exemples :
|
RADIANS(n) | Convertit les degrés en radians. Exemples :
|
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 :
|
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 :
|
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 :
|
SQUARE(n) | Renvoie le carré de l'expression donnée. Exemple :
|
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 :
|
DATEPART(item,date) | Renvoie l'élément de partie spécifié d'une date date sous forme d'entier. Exemples :
|
DATENAME(item,date) | Renvoie l'élément de partie spécifié de la date date sous forme de chaîne de caractères. Exemple :
|
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 :
|
DATEADD(i,n,d) | Ajoute le nombre n d'unités spécifié par la valeur i à la date donnée d. Exemple :
|
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 :
|
CHAR(integer) | Convertit le code ASCII en caractère équivalent. Exemple :
|
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 :
|
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 :
|
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 :
|
LTRIM(z) | Supprime les blancs de début dans la chaîne de caractères z. Exemple :
|
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 :
|
REPLACE(str1,str2,str3) | Remplace toutes les occurrences de str2 dans str1 par str3. Exemple :
|
REPLICATE(z,i) | Répète la chaîne de caractères z un i de fois. Exemple :
|
REVERSE(z) | Affiche la chaîne de caractères z dans l'ordre inverse. Exemple :
|
RIGHT(z,length) | Renvoie les derniers caractères de longueur de la chaîne de caractères z. Exemple :
|
RTRIM(z) | Supprime les blancs de fin de la chaîne de caractères z. Exemple :
|
SOUNDEX(a) | Renvoie un code SOUNDEX à quatre caractères pour déterminer la similitude entre deux chaînes de caractères. Exemple :
|
SPACE(length) | Renvoie une chaîne de caractères avec des espaces de longueur spécifiée par longueur. Exemple :
|
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 :
|
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 :
|
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 :
|
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 :
|
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 :
|
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 :
|
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 :
|
CURRENT_USER | Renvoie le nom de l'utilisateur actuel. |
DATALENGTH(z) | Calcule la longueur (en octets) du résultat de l'expression z. Exemple :
|
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 :
|
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 :
|
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 :
|
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 :
|
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 :
|
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 :
|
COLUMNPROPERTY(id, col, property) | Renvoie les informations sur la colonne spécifiée. Exemple :
|
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 :
|
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 :
|
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 :
|
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 :
|
OBJECT_ID(obj_name) | Renvoie l'identificateur de l'objet de base de données obj_name. Exemple :
|
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 :
- NULL si l'option ANSI_NULL_DFLT_ON de l'instruction SET est définie sur ON
- NOT NULL Si l'option ANSI_NULL_DFLT_OFF de l'instruction SET est définie sur ON
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