Conversion de types de données (moteur de base de données)
S’applique à : SQL Server Base de données Azure SQL Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Point de terminaison d'analyse SQL dans Microsoft Fabric Entrepôt dans Microsoft Fabric Base de données SQL dans Microsoft Fabric
Les types de données peuvent être convertis dans les scénarios suivants :
- Lorsque les données d'un objet sont déplacées dans les données d'un autre objet, sont comparées ou combinées à ces dernières, les données d'un objet doivent être converties du type de données d'un objet en type de données de l'autre.
- Quand les données d’une colonne de résultats, d’un code de retour ou d’un paramètre de sortie Transact-SQL sont déplacées dans une variable de programme, elles doivent être converties du type de données système SQL Server vers le type de données de la variable.
Lors de la conversion entre une variable d'application et une colonne du jeu de résultats, un code de retour, un paramètre ou un marqueur de paramètre SQL Server, les conversions de types de données acceptées sont définies par l'API de base de données.
Conversions implicites et explicites
Les types de données peuvent être convertis implicitement ou explicitement.
Les conversions implicites sont invisibles pour l'utilisateur. SQL Server convertit automatiquement les données d'un type de données en un autre. Par exemple, quand un smallint est comparé à un int, le smallint est implicitement converti en int avant de poursuivre la comparaison.
GETDATE()
convertit implicitement en style 0
de date . SYSDATETIME()
convertit implicitement le style de date 21
.
Les conversions explicites utilisent les fonctions CAST
ou CONVERT
.
Les fonctions CAST et CONVERT convertissent une valeur (une variable locale, une colonne ou une autre expression) d’un type de données en un autre. Par exemple, la fonction CAST
convertit la valeur numérique de $157.27
en une chaîne de caractères '157.27'
:
CAST ( $157.27 AS VARCHAR(10) )
Utilisez CAST
au lieu de CONVERT
si vous souhaitez que le code de programmation Transact-SQL soit compatible avec la norme ISO. Utilisez CONVERT
et non CAST
pour bénéficier de la fonctionnalité style de la fonction CONVERT
.
L'illustration ci-dessous reprend toutes les conversions de types de données explicites et implicites autorisées pour les types de données SQL Server fournis par le système. Ces types sont notamment xml, bigint et sql_variant. Aucune conversion implicite d’attribution de valeur n’est effectuée à partir du type de données sql_variant, mais une conversion implicite vers sql_variant existe.
Le graphique précédent illustre toutes les conversions implicites et explicites autorisées dans SQL Server, mais il n’indique pas le type de données résultant de la conversion.
- Quand SQL Server effectue une conversion explicite, l’instruction elle-même détermine le type de données résultant.
- Pour les conversions implicites,ce sont les instructions d’assignation, comme la définition de la valeur d’une variable ou l’insertion d’une valeur dans une colonne, qui donnent le type de données défini par la déclaration de variable ou la définition de colonne.
- Pour les opérateurs de comparaison ou d’autres expressions, le type de données résultant dépend de la précédence des types de données.
À titre d'exemple, le script suivant définit une variable de type varchar, lui affecte une valeur de type int, puis sélectionne une concaténation de la variable avec une chaîne de caractères.
DECLARE @string VARCHAR(10);
SET @string = 1;
SELECT @string + ' is a string.'
La valeur int de 1
étant convertie en varchar, l’instruction SELECT
retourne la valeur 1 is a string.
.
L’exemple suivant illustre un script similaire avec à la place une variable int :
DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + ' is not a string.'
Dans ce cas, l’instruction SELECT
génère l’erreur suivante :
Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value ' is not a string.' to data type int.
Afin d’évaluer l’expression @notastring + ' is not a string.'
, SQL Server suit les règles de priorité des types de données pour effectuer la conversion implicite avant le calcul du résultat de l’expression. Étant donné que le type int a une priorité plus élevée que varchar, SQL Server tente de convertir la chaîne en entier, et échoue car cette chaîne ne peut pas être convertie en entier. Si l’expression fournit une chaîne pouvant être convertie, l’instruction réussit, comme dans l’exemple suivant :
DECLARE @notastring INT;
SET @notastring = '1';
SELECT @notastring + '1'
La chaîne 1
pouvant être convertie en valeur entière 1
dans ce cas, l’instruction SELECT
retourne la valeur 2
. L’opérateur +
devient une addition plutôt qu’une concaténation quand les types de données fournis sont des entiers.
Comportements de conversion de types de données
Lors de la conversion du type de données d'un objet SQL Server en un autre, certaines conversions de types de données implicites et explicites ne sont pas prises en charge. Ainsi, une valeur nchar ne peut pas être convertie en valeur image. Un nchar ne peut être converti en binaire qu’à l’aide d’une conversion explicite. Une conversion implicite en binaire n’est pas prise en charge. Cependant, une valeur nchar peut être convertie explicitement ou implicitement en nvarchar.
Les articles suivants décrivent les comportements de conversion propres aux types de données correspondants :
- binary et varbinary
- datetime2
- money et smallmoney
- bit
- datetimeoffset
- smalldatetime
- char et varchar
- decimal et numeric
- sql_variant
- date
- float et real
- time
- datetime
- int, bigint, smallint et tinyint
- uniqueidentifier
- xml
- json
Convertir les types de données en utilisant les procédures stockées OLE Automation
Étant donné que SQL Server utilise les types de données Transact-SQL et qu'OLE Automation utilise les types de données Visual Basic, les procédures stockées OLE Automation doivent convertir les données qu'elles s'échangent.
Le tableau suivant décrit la conversion des types de données SQL Server en types de données Visual Basic.
Type de données SQL Server | Type de données Visual Basic |
---|---|
char, varchar, text, nvarchar, ntext | Chaîne |
decimal, numeric | Chaîne |
bit | Booléen |
binary, varbinary, image | Tableaux Byte() unidimensionnels |
int | Long |
smallint | Integer |
tinyint | Byte |
float | Double |
real | Unique |
money, smallmoney | Devise |
datetime, smalldatetime | Date |
Tout ce qui est défini sur NULL |
Variant ayant la valeur Null |
Toutes les valeurs uniques SQL Server sont converties en une valeur unique Visual Basic, à l'exception des valeurs binaires, varbinary, et image. Ces valeurs sont converties en tableau Byte()
unidimensionnel dans Visual Basic. Ce tableau possède une plage Byte( 0 to length 1)
où durée représente le nombre d’octets dans les valeurs SQL Server binaire, varbinary, ou image.
Il s'agit des conversions des types de données Visual Basic en types de données SQL Server.
Type de données Visual Basic | Type de données SQL Server |
---|---|
Long, Integer, Byte, Boolean, Object | int |
Double, Single | float |
Devise | money |
Date | datetime |
Chaîne avec 4 000 caractères au maximum | varchar/nvarchar |
Chaîne avec plus de 4 000 caractères | text/ntext |
Tableau Byte() unidimensionnel avec 8 000 octets au maximum |
varbinary |
Tableau Byte() unidimensionnel avec plus de 8 000 octets |
image |