Travailler avec les types de données
Les colonnes et les variables utilisées dans Transact-SQL ont chacune un type de données. Le comportement des valeurs dans les expressions dépend du type de données de la colonne ou de la variable référencée. Par exemple, comme vous l’avez vu précédemment, vous pouvez utiliser l’opérateur + pour concaténer deux valeurs de chaîne ou ajouter deux valeurs numériques.
Le tableau suivant répertorie les types de données courants pris en charge dans une base de données SQL Server.
Valeur numérique exacte
Valeur numérique approchée
Caractère
Date/Heure
Binary
Autre
TINYINT
float
char
Date
binary
cursor
SMALLINT
real
varchar
time
varbinary
hierarchyid
int
texte
DATETIME
image
sql_variant
bigint
NCHAR
datetime2
table
bit
NVARCHAR
smalldatetime
timestamp
decimal/numeric
ntext
datetimeoffset
UNIQUEIDENTIFIER
numeric
Xml
money
Geography
SMALLMONEY
geometry
Notes
Pour plus d’informations sur les différents types de données et leurs attributs, consultez la Documentation de référence sur Transact-SQL.
Conversion de type de données
Les valeurs des types de données compatibles peuvent être converties implicitement si nécessaire. Par exemple, supposez que vous pouvez utiliser l’opérateur + pour ajouter un nombre + à un nombre décimal, ou pour concaténer une valeur char de longueur fixe et une valeur varchar de longueur variable. Toutefois, dans certains cas, vous devrez peut-être convertir explicitement les valeurs d’un type de données en un autre. Par exemple, si vous essayez d’utiliser + pour concaténer une valeur de type varchar et une valeur de type decimal, une erreur se produit, sauf si vous convertissez d’abord la valeur numérique en un type de données de chaîne compatible.
Notes
Les conversions implicites et explicites s’appliquent à certains types de données, et certaines conversions ne sont pas possibles. Pour plus d’informations, utilisez le graphique figurant dans la Documentation de référence sur Transact-SQL.
T-SQL comprend des fonctions pour vous aider à effectuer explicitement une conversion entre des types de données
CAST et TRY_CAST
La fonction CAST convertit une valeur en un type de données spécifié si la valeur est compatible avec le type de données cible. Une erreur sera renvoyée en cas d’incompatibilité.
Par exemple, la requête suivante utilise CAST pour convertir les valeurs entières de la colonne ProductID en valeurs varchar (avec un maximum de 4 caractères) afin de les concaténer avec une autre valeur à base de caractères :
SELECT CAST(ProductID AS varchar(4)) + ': ' + Name AS ProductName
FROM Production.Product;
Les résultats possibles de cette requête peuvent ressembler à ceci :
ProductName
680: HL Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Toutefois, supposons que la colonne Size de la table Production.Product est une colonne nvarchar (longueur variable, données de texte Unicode) qui contient des tailles numériques (par exemple, 58) et des tailles textuelles (telles que « S », « M » ou « L »). La requête suivante tente de convertir les valeurs de cette colonne en un type de données entier :
SELECT CAST(Size AS integer) As NumericSize
FROM Production.Product;
Cette requête entraîne le message d’erreur suivant :
Error: Conversion failed when converting the nvarchar value ’M’ to data type int.
Étant donné qu’au moins certaines des valeurs de la colonne sont numériques, vous souhaiterez peut-être convertir ces valeurs et ignorer les autres. Vous pouvez utiliser la fonction TRY_CAST pour convertir les types de données.
SELECT TRY_CAST(Size AS integer) As NumericSize
FROM Production.Product;
Cette fois, les résultats peuvent ressembler à ceci :
NumericSize
58
58
NULL
NULL
...
Les valeurs qui peuvent être converties en type de données numériques sont retournées sous forme de valeurs décimales, et les valeurs incompatibles sont retournées comme NULL, ce qui sert à indiquer qu’une valeur est inconnue.
Notes
Nous examinerons les considérations relatives à la gestion des valeurs NULL plus loin dans cette unité.
CONVERT et TRY_CONVERT
CAST est la fonction ANSI SQL standard pour la conversion de types de données, et est utilisée dans de nombreux systèmes de base de données. Dans Transact-SQL, vous pouvez également utiliser la fonction CONVERT, comme illustré ici :
SELECT CONVERT(varchar(4), ProductID) + ': ' + Name AS ProductName
FROM Production.Product;
Une fois encore, cette requête retourne la valeur convertie dans le type de données spécifié, comme suit :
ProductName
680: HL Road Frame - Black, 58
706: HL Road Frame - Red, 58
707: Sport-100 Helmet, Red
708: Sport-100 Helmet, Black
...
Tout comme CAST, CONVERT a une variante TRY_CONVERT qui retourne NULL pour les valeurs incompatibles.
Un autre avantage de l’utilisation de CONVERT par rapport à CAST est que CONVERT comprend également un paramètre qui vous permet de spécifier un style de mise en forme lors de la conversion de valeurs numériques et de date en chaînes. Par exemple, considérez la requête suivante :
SELECT SellStartDate,
CONVERT(varchar(20), SellStartDate) AS StartDate,
CONVERT(varchar(10), SellStartDate, 101) AS FormattedStartDate
FROM SalesLT.Product;
Les résultats de cette requête peuvent se présenter comme suit :
DateDébutVente
StartDate
FormattedStartDate
2002-06-01T00:00:00
Jun 1 2002 12:00AM
6/1/2002
2002-06-01T00:00:00
Jun 1 2002 12:00AM
6/1/2002
2005-07-01T00:00:00
Jul 1 2005 12:00AM
7/1/2005
2005-07-01T00:00:00
Jul 1 2005 12:00AM
7/1/2005
...
...
...
Notes
Pour en savoir plus sur les codes de mise en forme de style que vous pouvez utiliser avec CONVERT, consultez la Documentation de référence sur Transact-SQL.
PARSE et TRY_PARSE
La fonction PARSE est conçue pour convertir des chaînes mises en forme qui représentent des valeurs numériques ou de date/heure. Par exemple, considérez la requête suivante (qui utilise des valeurs littérales plutôt que des valeurs de colonnes dans une table) :
SELECT PARSE('01/01/2021' AS date) AS DateValue,
PARSE('$199.99' AS money) AS MoneyValue;
Les résultats de cette requête se présentent comme suit :
ValDate
MoneyValue
2021-01-01T00:00:00
199.99
Comme avec CAST et CONVERT, PARSE a une variante TRY_PARSE qui retourne les valeurs incompatibles comme NULL.
Notes
Lorsque vous utilisez des types de données de type decimal ou numeric, il se peut que vous deviez arrondir à un nombre entier ou définir la virgule décimale, ce qui est possible grâce à la précision et à l’échelle. Pour mieux comprendre les concepts de précision et d’échelle, consultez la Documentation de référence sur Transact-SQL.
STR
La fonction STR convertit une valeur numérique en varchar.
Par exemple :
SELECT ProductID, '$' + STR(ListPrice) AS Price
FROM Production.Product;
Le résultat doit être similaire à ceci :
ProductID
Price
680
$1432.00
706
$1432.00
707
35,00 $
...
...