CAST et CONVERT (Transact-SQL)

 

CETTE RUBRIQUE S’APPLIQUE À : ouiSQL Server (à partir de la version 2008)ouiAzure SQL DatabaseouiAzure SQL Data WarehouseouiParallel Data Warehouse

Convertit une expression d'un type de données en un autre.

System_CAPS_ICON_tip.jpg Astuce

Nombreuses exemples en bas de cette rubrique.

Topic link icon Conventions de la syntaxe Transact-SQL

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse  
    
-- Syntax for CAST:  
CAST ( expression AS data_type [ ( length ) ] )  
  
-- Syntax for CONVERT:  
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )  

expression
Valide expression.

data_type
Type de données cible. Cela inclut les xml, bigint, et sql_variant. Les types de données alias ne sont pas autorisés.

longueur
Entier facultatif qui spécifie la longueur du type de données cible. La valeur par défaut est 30.

style
Expression entière qui spécifie comment la fonction CONVERT pour convertir expression. Si le style est NULL, une valeur NULL est retournée. La plage est déterminée par data_type. Pour plus d'informations, consultez la section Notes.

Retourne expression traduit en data_type.

Accéder aux 15 exemples à la fin de cette rubrique

Lorsque expression est un type de données date ou heure style peut être une des valeurs indiquées dans le tableau suivant. Les autres valeurs sont traitées comme étant 0. . À partir de SQL Server 2012, les seuls styles pris en charge lors de la conversion de types date et heure en datetimeoffset sont 0 ou 1. Tous les autres styles de conversion retournent l'erreur 9809.

SQL Server prend en charge le format de date dans le style arabe à l'aide de l'algorithme koweitien.

Sans siècle (aa) (1)Avec siècle (aaaa)StandardEntrée/sortie (3)
-0 or 100 (1,2)Valeur par défaut pour datetime et smalldatetimemois jj aaaa hh:miAM (ou PM)
1101États-Unis1 = mm/jj/aa

101 = mm/jj/aaaa
2102ANSI2 = aa.mm.jj

102 = aaaa.mm.jj
3103Anglais/Français3 = jj/mm/aa

103 = jj/mm/aaaa
4104Allemand4 = jj.mm.aa

104 = jj.mm.aaaa
5105Italien5 = jj-mm-aa

105 = jj-mm-aaaa
6106 (1)-6 = jj mois aa

106 = jj mois aaaa
7107 (1)-7 = Mois jj, aa

107 = Mois jj, aaaa
8108-hh:mi:ss
-9 or 109 (1,2)Valeur par défaut + millièmes de secondesmois jj aaaa hh:mi:ss:mmmAM (ou PM)
10110États-Unis10 = mm-jj-aa

110 = mm-jj-aaaa
11111Japon11 = aa/mm/jj

111 = aaaa/mm/jj
12112ISO12 = aammjj

112 = aaaammjj
-13 or 113 (1,2)Valeur par défaut Europe + millièmes de secondesjj mois aaaa hh:mi:ss:mmm (24h)
14114-hh:mi:ss:mmm(24h)
-20 ou 120 (2)ODBC canoniqueaaaa-mm-jj hh:mi:ss (24h)
-21 ou 121 (2)Valeur par défaut canonique ODBC (avec millisecondes) pour time, date, datetime2, et datetimeoffsetaaaa-mm-jj hh:mi:ss.mmm (24h)
-126 (4)ISO8601aaaa-mm-jjThh:mi:ss.mmm (sans espace)

Remarque : Lorsque la valeur en millisecondes (mmm) est que 0, la valeur de milliseconde n’est pas affichée. Par exemple, la valeur « 2012-11-07T18:26:20.000 » est affichée comme suit « 2012-11-07T18:26:20 ».
-127(6, 7)ISO8601 avec fuseau horaire Z.aaaa-mm-jjThh:mi:ss.mmmZ (sans espace)

Remarque : Lorsque la valeur en millisecondes (mmm) est que 0, la valeur en millisecondes n’est pas affichée. Par exemple, la valeur « 2012-11-07T18:26:20.000 » est affichée comme suit « 2012-11-07T18:26:20 ».
-130 (1,2)Calendrier islamique (5)jj mois aaaa hh:mi:ss:mmmAM

Dans ce style, « mois » représente une représentation unicode Hijri à plusieurs jetons pour le nom complet du mois. Cette valeur ne sera pas retournée correctement sur les installations en anglais américain par défaut de SSMS.
-131 (2)Calendrier islamique (5)jj/mm/yyyy hh:mi:ss:mmmAM

1 ces valeurs de style retournent des résultats non déterministes. Inclut tous les styles (aa, c'est-à-dire sans siècle) et un sous-ensemble de styles (aaaa, c'est-à-dire avec siècle).

2 les valeurs par défaut (style0 ou 100, 9 ou 109, 13 ou 113, 20 ou 120, et 21 ou 121) renvoient toujours le siècle (aaaa).

3 d’entrée lors de la conversion datetime; sortie lorsque vous convertissez des données de type caractère.

4 conçu pour le langage XML. Pour la conversion de datetime ou smalldatetime en données caractères, le format de sortie est décrit dans le tableau précédent.

5 Hijri est un système de calendrier avec différentes variantes. SQL Server utilise l'algorithme koweitien.

System_CAPS_ICON_important.jpg Important


Par défaut, SQL Server interprète les années à deux chiffres par rapport à l'année de coupure 2049. Autrement dit, l'année à deux chiffres 49 est interprétée comme étant 2049 et l'année 50 comme étant 1950. De nombreuses applications clientes, comme celles basées sur les objets Automation, utilisent l'année de coupure 2030. SQL Server fournit l’option two digit year cutoff configuration qui modifie l’année de coupure utilisée par SQL Server et permet le traitement cohérent des dates. Nous vous recommandons d'utiliser la fonctionnalité d'années exprimées sur quatre chiffres.

6 pris en charge uniquement lors de la conversion de type de données caractères datetime ou smalldatetime. Lorsque les données de caractères qui représente uniquement date ou heure uniquement des composants est effectué à la datetime ou smalldatetime des types de données, le composant d’heure non spécifié est défini sur 00:00:00.000 et le composant de date non spécifié est défini à 1900-01-01.

7l’indicateur de fuseau horaire facultatif Z est utilisé pour faciliter le mappage XML datetime valeurs qui comportent des informations de fuseau horaire pour SQL Server datetime valeurs sans fuseau horaire. Z est l'indicateur du fuseau horaire UTC-0. Les autres fuseaux horaires sont indiqués avec le décalage HH:MM dans la direction + ou -. Par exemple : 2006-12-12T23:45:12-08:00.

Lorsque vous convertissez des données de caractères de smalldatetime, les styles comportant les secondes ou les millisecondes affichent des zéros à ces positions. Vous pouvez tronquer les parties de date non désirés lorsque vous convertissez datetime ou smalldatetime valeurs en utilisant un char ou varchar longueur de type de données.

Lors de la conversion datetimeoffset de données de type caractère avec un style qui inclut une heure, un décalage de fuseau horaire est ajouté au résultat.

Lorsque expression est float ou réel, style peut être une des valeurs indiquées dans le tableau suivant. Les autres valeurs sont traitées comme étant 0.

ValueSortie
0 (valeur par défaut)6 chiffres maximum. À utiliser pour la notation scientifique si nécessaire.
1Toujours 8 chiffres. À utiliser obligatoirement pour la notation scientifique.
2Toujours 16 chiffres. À utiliser obligatoirement pour la notation scientifique.
3Toujours 17 chiffres. À utiliser pour la conversion sans perte. Avec ce style, chaque float distincte ou la valeur réelle est garantie pour convertir une chaîne de caractères distincts.

 S’applique à : Base de données Azure SQL, et de démarrer dans SQL Server 2016.
126, 128, 129Incluses pour des raisons d'héritage et peuvent être déconseillées dans une version ultérieure.

Lorsque expression est money ou smallmoney, style peut être une des valeurs indiquées dans le tableau suivant. Les autres valeurs sont traitées comme étant 0.

ValueSortie
0 (valeur par défaut)Pas de virgule tous les trois chiffres à gauche du point décimal, et deux chiffres à droite de celui-ci. Par exemple, 4235.98.
1Insertion d'une virgule tous les trois chiffres à gauche du point décimal, et deux chiffres à droite de celui-ci. Par exemple 3,510.92.
2Pas de virgule tous les trois chiffres à gauche du point décimal, et quatre chiffres à droite de celui-ci. Par exemple 4235.9819.
126Équivalent du style 2 lors de la conversion en char(n) ou varchar(n)

Lorsque expression est xml, style peut être une des valeurs indiquées dans le tableau suivant. Les autres valeurs sont traitées comme étant 0.

ValueSortie
0 (valeur par défaut)Utilisez le comportement d'analyse par défaut permettant de supprimer les espaces non significatifs et n'autorisant pas de sous-ensemble DTD interne.

Remarque : Lorsque vous convertissez le xml type de données, SQL Server espaces blancs non significatifs sont gérés différemment que dans XML 1.0. Pour plus d’informations, consultez créer les Instances de XML Data.
1Maintien des espaces non significatifs. Ce paramètre de style définit la valeur par défaut XML : space gestion pour le même comportement que si XML : space = « preserve » a été spécifié à la place.
2Activation du traitement limité de sous-ensembles DTD internes.

Si cette option est activée, le serveur peut utiliser les informations suivantes fournies dans un sous-ensemble DTD interne afin de procéder à des opérations d'analyse autres que celles de validation des données.

-Les valeurs par défaut pour les attributs sont appliqués.

-Références d’entité internes sont résolus et développés.

-Le modèle de contenu DTD est vérifié pour vérifier si la syntaxe est correcte.

 

L'analyseur ignore les sous-ensembles DTD externes. Il n’évalue pas la déclaration XML pour voir si le autonome attribut a la valeur Oui ou sans, mais l’analyse à la place de l’instance XML comme s’il s’agit d’un document autonome.
3Maintien des espaces non significatifs et activation du traitement limité de sous-ensembles DTD internes.

Lorsque expression est Binary, varbinary, char, ou varchar (n), style peut être une des valeurs indiquées dans le tableau suivant. Les valeurs de style qui ne sont pas répertoriées dans le tableau retournent une erreur.

ValueSortie
0 (valeur par défaut)Traduit des caractères ASCII en octets de binaire ou des octets de binaire en caractères ASCII. Chaque caractère ou octet est converti 1:1.

Si le data_type est un type binaire, les caractères 0 x sont ajoutés à gauche du résultat.
1, 2Si le data_type est un type binaire, l’expression doit être une expression de caractères. Le expression doit être composée d’un nombre pair de chiffres hexadécimaux (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, a, b, c, d, e, f). Si le style est définie sur 1 les caractères 0 x doivent être les deux premiers caractères de l’expression. Si l'expression contient un nombre impair de caractères ou si l'un des caractères n'est pas valide, une erreur est générée.

Si la longueur de l’expression convertie est supérieure à la longueur de la data_type le résultat est tronqué à droite.

Longueur fixe data_types qui sont plus longs que le résultat converti se voient ajouter des zéros à droite du résultat.

Si le data_type est un type caractère, l'expression doit être une expression binaire. Chaque caractère binaire est converti en deux caractères hexadécimaux. Si la longueur de l’expression convertie est supérieure à la data_type longueur, il est tronqué à droite.

Si le data_type est de type caractère de taille fixe et la longueur du résultat converti est inférieure à la longueur de la data_type; des espaces sont ajoutés à droite de l’expression convertie pour conserver un nombre pair de chiffres hexadécimaux.

Les caractères 0 x sont ajoutés à gauche du résultat converti pour style 1.

Une conversion implicite est une conversion pour laquelle il n'est pas nécessaire de spécifier les fonctions CAST ou CONVERT. À l'inverse, une conversion explicite requiert que la fonction CAST ou CONVERT soit indiquée. 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. Ceux-ci incluent xml, bigint, et sql_variant. Il n’existe aucune conversion implicite lors de l’attribution de la sql_variant type de données, mais il existe une conversion implicite vers sql_variant.

System_CAPS_ICON_tip.jpg Astuce


Ce graphique est disponible en tant que fichier PDF téléchargeable dans le Microsoft Download Center.

Data type conversion table

Lorsque vous effectuez une conversion entre datetimeoffset et les types de caractères char, varchar, nchar, et nvarchar le fuseau horaire convertie partie décalage doit toujours être des chiffres doubles pour HH et MM, par exemple, -08:00.

System_CAPS_ICON_note.jpg Remarque


Étant donné que les données Unicode utilisent toujours un nombre pair d’octets, soyez prudent lorsque vous convertissez binaire ou varbinary vers ou depuis Unicode pris en charge les types de données. Ainsi, la conversion suivante retourne la valeur hexadécimale 4100 et non pas 41 : SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary).

Types de données de valeur élevée présentent le même comportement de conversion implicite et explicite que leurs homologues plus petits, en particulier le varchar, nvarchar et varbinary des types de données. Vous devez cependant prendre en compte les recommandations suivantes :

  • Conversion de image à varbinary (max) et vice versa est une conversion implicite, et sont donc des conversions entre texte et varchar (max), et ntext et nvarchar (max).

  • Types de conversion de données de valeur élevée, tels que varchar (max), à un plus petites équivalent type de données, tel que varchar, est une conversion implicite, mais une troncation se produit si la valeur élevée est trop volumineuse pour la longueur spécifiée du type de données plus petits.

  • Conversion de varchar, nvarchar, ou varbinary à leurs données de valeur élevée correspondantes types s’effectue implicitement.

  • Conversion à partir de la sql_variant type de données pour les types de données de valeur élevée est une conversion explicite.

  • Types de données de valeur élevée ne peut pas être convertis en la sql_variant type de données.

Pour plus d’informations sur la conversion à partir de la xml de type de données, consultez la page créer les Instances de XML Data.

Lorsque vous explicitement ou implicitement converti le xml type de données type de données binaires ou de chaîne, le contenu de la xml type de données est sérialisé par rapport à un ensemble de règles. Pour plus d’informations sur ces règles, consultez définir la sérialisation des données XML. Pour plus d’informations sur la conversion d’autres types de données en le xml de type de données, consultez la page créer les Instances de XML Data.

Conversion automatique n’est pas pris en charge pour la texte et image des types de données. Vous pouvez explicitement convertir texte les données en données caractères, et image données binaire ou varbinary, mais la longueur maximale est de 8 000 octets. Si vous tentez une conversion non prévue, par exemple une expression de caractères contenant des lettres à une int, SQL Server renvoie un message d’erreur.

Lorsque l'entrée et la sortie de CAST ou CONVERT sont des chaînes de caractères, l'entrée et la sortie présentent les mêmes classement et étiquette de classement. Si l'entrée n'est pas une chaîne de caractères, la sortie présente le classement par défaut de la base de données et une étiquette de classement de contrainte par défaut. Pour plus d’informations, consultez la priorité de classement ( ; Transact-SQL ) ;.

Pour attribuer un classement différent à la sortie, appliquez la clause COLLATE à l'expression de résultat de la fonction CAST ou CONVERT. Par exemple :

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

Lorsque vous convertissez des caractères ou des expressions binaires (char, nchar, nvarchar, varchar, binaire, ou varbinary) en une expression d’un autre type de données, données peuvent être tronquées, partiellement affichées, ou une erreur est renvoyée, car le résultat est trop court pour être affichée. Conversions char, varchar, nchar, nvarchar, binaire, et varbinary sont tronqués, sauf pour les conversions répertoriées dans le tableau suivant.

Du type de donnéesAu type de donnéesRésultat
int, smallint, ou tinyintChar*
varchar*
NCHARE
nvarcharE
Money, smallmoney, numérique, décimal, float, ou réelCharE
varcharE
NCHARE
nvarcharE

* = Expression résultante trop courte pour l’afficher. E = Erreur retournée car l'expression résultante est trop courte pour être affichée.

SQL Server garantit que seules des conversions en boucle, c'est-à-dire qui convertissent un type de données en un autre puis à nouveau en son type d'origine, restitueront les mêmes valeurs d'une version à l'autre de l'application. L'exemple suivant illustre un tel cas de figure :

DECLARE @myval decimal (5, 2);  
SET @myval = 193.57;  
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5));  
-- Or, using CONVERT  
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval));  

System_CAPS_ICON_note.jpg Remarque


N’essayez pas de construire binaire valeurs et de les convertir en un type de données de la catégorie de type de données numériques. SQL Server ne garantit pas que le résultat d’une décimal ou numérique la conversion en type de données binaire sera le même entre les versions de SQL Server.

L'exemple suivant illustre une expression résultante trop petite pour être affichée.

USE AdventureWorks2012;  
GO  
SELECT p.FirstName, p.LastName, SUBSTRING(p.Title, 1, 25) AS Title, CAST(e.SickLeaveHours AS char(1)) AS [Sick Leave]  
FROM HumanResources.Employee e JOIN Person.Person p ON e.BusinessEntityID = p.BusinessEntityID  
WHERE NOT e.BusinessEntityID >5;  

Voici l'ensemble des résultats.

FirstName LastName Title Sick Leave

--------- ------------- ------- --------

Ken Sanchez NULL *

Terri Duffy NULL *

Roberto Tamburello NULL *

Rob Walters NULL *

Gail Erickson Ms. *

(5 row(s) affected)

Si vous convertissez des données dont le type de données diffère sur l'emplacement de la virgule, la valeur résultante peut parfois être tronquée, parfois être arrondie. Le tableau suivant illustre ce comportement.

DePourComportement
numériquenumériqueArrondi
numériqueintTronqué
numériqueMoneyArrondi
MoneyintArrondi
MoneynumériqueArrondi
floatintTronqué
floatnumériqueArrondi

Conversion de float valeurs qui utilisent la notation scientifique à décimal ou numérique est limitée à des valeurs de précision de 17 chiffres uniquement. Toute valeur avec une précision plus élevée que 17 sera arrondie à zéro.
floatdate/heureArrondi
date/heureintArrondi

Par exemple, les valeurs 10.6496 et-10.6496 peuvent tronquées ou arrondies pendant la conversion int ou numérique types :

SELECT  CAST(10.6496 AS int) as trunc1,
        CAST(-10.6496 AS int) as trunc2,
        CAST(10.6496 AS numeric) as round1,
        CAST(-10.6496 AS numeric) as round2;

Résultats de la requête sont affichés dans le tableau suivant :

trunc1trunc2round1Round2
10-1011-11

Lors des conversions entre divers types de données dans lesquelles les types de données cibles comptent moins de chiffres décimaux que les types de données sources, la valeur obtenue est arrondie. Par exemple, le résultat découlant de la conversion suivante est $10.3497 :

SELECT CAST(10.3496847 AS money);

SQL Server Retourne un message d’erreur lors de la non numériques char, nchar, varchar, ou nvarchar sont converties en données int, float, numérique, ou décimal. SQL Server Renvoie également une erreur lorsqu’une chaîne vide (« ») est converti en numériques ou décimal.

Le tableau ci-dessous répertorie les styles pour lesquels la conversion chaîne-datetime est non déterministe.

Tous les styles inférieurs à 1001106
107109
113130

1 à l’exception des styles 20 et 21

À compter de SQL Server 2012, si vous utilisez des classements de caractères supplémentaires (SC), une opération de CONVERSION de nchar ou nvarchar à un nchar ou nvarchar type de plus petite longueur ne sera pas tronquée à l’intérieur d’une paire de substitution ; elle sera tronquée avant le caractère supplémentaire. Par exemple, le fragment de code suivant laisse @x avec seulement 'ab'. Il n'y a pas assez d'espace pour conserver le caractère supplémentaire.

DECLARE @x NVARCHAR(10) = 'ab' + NCHAR(0x10000);  
SELECT CAST (@x AS NVARCHAR(3));  
  

Lors de l'utilisation de classements SC, le comportement de CONVERT, est analogue à celui de CAST.

Dans les versions antérieures de SQL Server, le style par défaut pour les opérations CAST et CONVERT sur fois et datetime2 des types de données est 121, sauf si des types sont utilisé dans une expression de colonne calculée. Pour les colonnes calculées, le style par défaut est 0. Ce comportement influe sur les colonnes calculées lorsqu'elles sont créées, utilisées dans des requêtes impliquant le paramétrage automatique, ou utilisées dans des définitions de contraintes.

Niveau de compatibilité est 110 et supérieur, le style par défaut pour les opérations CAST et CONVERT sur fois et datetime2 des types de données est toujours 121. Si votre requête repose sur l'ancien comportement, utilisez un niveau de compatibilité inférieur à 110, ou spécifiez explicitement le style 0 dans la requête affectée.

La mise à niveau de la base de données vers le niveau de compatibilité 110 et supérieur ne modifie pas les données utilisateur stockées sur le disque. Vous devez corriger manuellement ces données comme il convient. Par exemple, si vous avez utilisé SELECT INTO pour créer une table à partir d'une source qui contenait une expression de colonne calculée décrite ci-dessus, les données (utilisant le style 0) sont stockées à la place de la définition de colonne calculée. Vous devez mettre à jour manuellement ces données pour qu'elles correspondent au style 121.

A. Utilisation simultanée de CAST et CONVERT

Chacun des exemples récupère le nom de chaque produit possédant un 3 au premier chiffre de son prix et convertit son champ ListPrice en type int.

-- Use CAST  
USE AdventureWorks2012;  
GO  
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice  
FROM Production.Product  
WHERE CAST(ListPrice AS int) LIKE '3%';  
GO  
  
-- Use CONVERT.  
USE AdventureWorks2012;  
GO  
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice  
FROM Production.Product  
WHERE CONVERT(int, ListPrice) LIKE '3%';  
GO  

B. Utilisation de CAST avec des opérateurs arithmétiques

L'exemple suivant illustre le calcul effectué sur une colonne unique (intitulée Computed) où le total des ventes de l'année en cours (SalesYTD) est divisé par le pourcentage de commission (dont la valeur se trouve dans CommissionPCT). Le résultat est converti en type de données int après avoir été arrondi au chiffre entier le plus proche.

USE AdventureWorks2012;  
GO  
SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS Computed  
FROM Sales.SalesPerson   
WHERE CommissionPCT != 0;  
GO  

Voici l'ensemble des résultats.

Computed

------

379753754

346698349

257144242

176493899

281101272

0

301872549

212623750

298948202

250784119

239246890

101664220

124511336

97688107

(14 row(s) affected)

C. Utilisation de CAST pour la concaténation d'expressions

L'exemple suivant illustre la concaténation d'expressions de type non caractère et non binaire par le biais de CAST.

USE AdventureWorks2012;  
GO  
SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice  
FROM Production.Product  
WHERE ListPrice BETWEEN 350.00 AND 400.00;  
GO  

Voici l'ensemble des résultats.

ListPrice

------------------

The list price is 357.06

The list price is 364.09

The list price is 364.09

The list price is 364.09

The list price is 364.09

(5 row(s) affected)

D. Utilisation de CAST pour faciliter la lecture des résultats

L'exemple suivant s'appuie sur CAST dans la liste de sélection afin de convertir la colonne Name en colonne de type char(10).

USE AdventureWorks2012;  
GO  
SELECT DISTINCT CAST(p.Name AS char(10)) AS Name, s.UnitPrice  
FROM Sales.SalesOrderDetail AS s   
JOIN Production.Product AS p   
    ON s.ProductID = p.ProductID  
WHERE Name LIKE 'Long-Sleeve Logo Jersey, M';  
GO  

Voici l'ensemble des résultats.

Name UnitPrice

---------- ---------------------

Long-Sleev 31.2437

Long-Sleev 32.4935

Long-Sleev 49.99

(3 row(s) affected)

E. Utilisation de CAST avec la clause LIKE

L'exemple suivant convertit la colonne money de type SalesYTD en colonne de type int, puis en colonne de type char(20) de façon à pouvoir l'utiliser avec la clause LIKE.

USE AdventureWorks2012;  
GO  
SELECT p.FirstName, p.LastName, s.SalesYTD, s.BusinessEntityID  
FROM Person.Person AS p   
JOIN Sales.SalesPerson AS s   
    ON p.BusinessEntityID = s.BusinessEntityID  
WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%';  
GO  

Voici l'ensemble des résultats.

FirstName LastName SalesYTD SalesPersonID

---------------- ------------------- ---------------- -------------

Tsvi Reiter 2811012.7151 279

Syed Abbas 219088.8836 288

Rachel Valdez 2241204.0424 289

(3 row(s) affected)

F. Utilisation de CONVERT ou de CAST avec des données au format XML typé

Voici plusieurs exemples qui illustrent l’utilisation de CONVERT pour convertir XML typé à l’aide de la Type de données XML et les colonnes ( ; SQL Server ) ;.

Cet exemple convertit une chaîne incluant des espaces, du texte et des balises en XML typé, puis supprime tous les espaces non significatifs (correspondant aux espaces délimitant les nœuds) :

CONVERT(XML, '<root><child/></root>')  

Cet exemple convertit une chaîne similaire incluant des espaces, du texte et des balises en XML typé, mais conserve les espaces non significatifs (correspondant aux espaces délimitant les nœuds) :

CONVERT(XML, '<root>          <child/>         </root>', 1)  

Enfin, cet exemple convertit une chaîne similaire incluant des espaces, du texte et des balises en XML typé :

CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)  

Pour plus d’exemples, consultez créer les Instances de XML Data.

G. Utilisation de CAST et de CONVERT avec des données de type datetime

L'exemple suivant affiche la date et l'heure actuelles, utilise CAST pour convertir la date et l'heure actuelles en type de données caractères, puis utilise CONVERT pour afficher la date et l'heure au format ISO 8901.

SELECT   
   GETDATE() AS UnconvertedDateTime,  
   CAST(GETDATE() AS nvarchar(30)) AS UsingCast,  
   CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601  ;  
GO  

Voici l'ensemble des résultats.

UnconvertedDateTime UsingCast UsingConvertTo_ISO8601

----------------------- ------------------------------ ------------------------------

2006-04-18 09:58:04.570 Apr 18 2006 9:58AM 2006-04-18T09:58:04.570

(1 row(s) affected)

L'exemple suivant est plus ou moins l'inverse de l'exemple précédent. Cet exemple affiche la date et l'heure sous forme de données caractères, utilise CAST pour convertir les données caractères en type de données datetime, puis utilise CONVERT pour convertir le type de données caractères en type de données datetime.

SELECT   
   '2006-04-25T15:50:59.997' AS UnconvertedText,  
   CAST('2006-04-25T15:50:59.997' AS datetime) AS UsingCast,  
   CONVERT(datetime, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;  
GO  

Voici l'ensemble des résultats.

UnconvertedText UsingCast UsingConvertFrom_ISO8601

----------------------- ----------------------- ------------------------

2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997

(1 row(s) affected)

H. Utilisation de CONVERT avec des données binaires et caractères

Les exemples suivants montrent les résultats de la conversion de données binaires et caractères en utilisant des styles différents.

--Convert the binary value 0x4E616d65 to a character value.  
SELECT CONVERT(char(8), 0x4E616d65, 0) AS [Style 0, binary to character];  

Voici l'ensemble des résultats.

Style 0, binary to character

----------------------------

Name

(1 row(s) affected)

--The following example shows how Style 1 can force the result  
--to be truncated. The truncation is caused by  
--including the characters 0x in the result.  
SELECT CONVERT(char(8), 0x4E616d65, 1) AS [Style 1, binary to character];  

Voici l'ensemble des résultats.

Style 1, binary to character

------------------------------

0x4E616D

(1 row(s) affected)

--The following example shows that Style 2 does not truncate the  
--result because the characters 0x are not included in  
--the result.  
SELECT CONVERT(char(8), 0x4E616d65, 2) AS [Style 2, binary to character];  

Voici l'ensemble des résultats.

Style 2, binary to character

------------------------------

4E616D65

(1 row(s) affected)

--Convert the character value 'Name' to a binary value.  
SELECT CONVERT(binary(8), 'Name', 0) AS [Style 0, character to binary];  

Voici l'ensemble des résultats.

Style 0, character to binary

----------------------------------

0x4E616D6500000000

(1 row(s) affected)

SELECT CONVERT(binary(4), '0x4E616D65', 1) AS [Style 1, character to binary];  

Voici l'ensemble des résultats.

Style 1, character to binary

----------------------------------

0x4E616D65

(1 row(s) affected)

SELECT CONVERT(binary(4), '4E616D65', 2) AS [Style 2, character to binary];  

Voici l'ensemble des résultats.

Style 2, character to binary

----------------------------------

0x4E616D65

(1 row(s) affected)

I. Convertit les types de données de date et d'heure

L'exemple suivant décrit la conversion des types de données date, time, et datetime.

DECLARE @d1 date, @t1 time, @dt1 datetime;  
SET @d1 = GETDATE();  
SET @t1 = GETDATE();  
SET @dt1 = GETDATE();  
SET @d1 = GETDATE();  
-- When converting date to datetime the minutes portion becomes zero.  
SELECT @d1 AS [date], CAST (@d1 AS datetime) AS [date as datetime];  
-- When converting time to datetime the date portion becomes zero   
-- which converts to January 1, 1900.  
SELECT @t1 AS [time], CAST (@t1 AS datetime) AS [time as datetime];  
-- When converting datetime to date or time non-applicable portion is dropped.  
SELECT @dt1 AS [datetime], CAST (@dt1 AS date) AS [datetime as date], CAST (@dt1 AS time) AS [datetime as time];  

J. Utilisation de CAST et CONVERT

Cet exemple récupère le nom du produit pour les produits qui ont un 3 dans le premier chiffre de son prix et les convertit leur ListPrice à int.

-- Uses AdventureWorks  
  
SELECT EnglishProductName AS ProductName, ListPrice  
FROM dbo.DimProduct  
WHERE CAST(ListPrice AS int) LIKE '3%';  
  

Cet exemple montre la même requête, à l’aide de la CONVERSION au lieu de CAST.

USE ssawPDW;  
  
SELECT EnglishProductName AS ProductName, ListPrice  
FROM dbo.DimProduct  
WHERE CONVERT(int, ListPrice) LIKE '3%';  

K. Utilisation de CAST avec des opérateurs arithmétiques

L’exemple suivant calcule le calcul effectué sur une seule colonne en divisant le prix unitaire du produit (UnitPrice) par le pourcentage de remise (UnitPriceDiscountPct). Le résultat est converti en type de données int après avoir été arrondi au chiffre entier le plus proche.

-- Uses AdventureWorks   
  
SELECT ProductKey, UnitPrice,UnitPriceDiscountPct,  
       CAST(ROUND (UnitPrice*UnitPriceDiscountPct,0) AS int) AS DiscountPrice  
FROM dbo.FactResellerSales  
WHERE SalesOrderNumber = 'SO47355'   
      AND UnitPriceDiscountPct > .02  

Voici l'ensemble des résultats.

ProductKey UnitPrice UnitPriceDiscountPct DiscountPrice

---------- --------- -------------------- -------------

323 430.6445 0.05 22

213 18.5043 0.05 1

456 37.4950 0.10 4

456 37.4950 0.10 4

216 18.5043 0.05 1

L. Utilisation de CAST pour la concaténation d'expressions

L’exemple suivant concatène les expressions à l’aide de CAST.

-- Uses AdventureWorks  
  
SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice  
FROM dbo.DimProduct  
WHERE ListPrice BETWEEN 350.00 AND 400.00;  

Voici l'ensemble des résultats.

ListPrice

------------------------

The list price is 357.06

The list price is 364.09

The list price is 364.09

The list price is 364.09

The list price is 364.09

M. Utilisation de CAST pour faciliter la lecture des résultats

L’exemple suivant utilise le CAST dans la liste SELECT pour convertir la Name colonne à une char (10) colonne.

-- Uses AdventureWorks  
  
SELECT DISTINCT CAST(EnglishProductName AS char(10)) AS Name, ListPrice  
FROM dbo.DimProduct  
WHERE EnglishProductName LIKE 'Long-Sleeve Logo Jersey, M';  

Voici l'ensemble des résultats.

Name UnitPrice

---------- ---------

Long-Sleev 31.2437

Long-Sleev 32.4935

Long-Sleev 49.99

N. Utilisation de CAST avec la clause LIKE

L’exemple suivant convertit le money colonne ListPrice à un int type puis un char (20) type afin qu’il peut être utilisé avec la clause LIKE.

-- Uses AdventureWorks  
  
SELECT EnglishProductName AS Name, ListPrice  
FROM dbo.DimProduct  
WHERE CAST(CAST(ListPrice AS int) AS char(20)) LIKE '2%';  

O. Utilisation de CAST et de CONVERT avec des données de type datetime

L’exemple suivant affiche la date et heure actuelles, utilise CAST pour modifier la date et l’heure en un type de données caractère et utilise CONVERT affiche la date et l’heure au format ISO 8601.

-- Uses AdventureWorks  
  
SELECT TOP(1)  
   SYSDATETIME() AS UnconvertedDateTime,  
   CAST(SYSDATETIME() AS nvarchar(30)) AS UsingCast,  
   CONVERT(nvarchar(30), SYSDATETIME(), 126) AS UsingConvertTo_ISO8601  
FROM dbo.DimCustomer;  

Voici l'ensemble des résultats.

UnconvertedDateTime UsingCast UsingConvertTo_ISO8601

----------------------- ------------------------------ ------------------------------

07/20/2010 1:44:31 PM 2010-07-20 13:44:31.5879025 2010-07-20T13:44:31.5879025

L'exemple suivant est plus ou moins l'inverse de l'exemple précédent. L’exemple affiche une date et une heure sous forme de caractères, utilise un CAST pour convertir les données caractères pour le datetime type de données, puis utilise CONVERT pour convertir les données caractères pour le datetime type de données.

USE ssawPDW;   
  
SELECT TOP(1)   
   '2010-07-25T13:50:38.544' AS UnconvertedText,  
CAST('2010-07-25T13:50:38.544' AS datetime) AS UsingCast,  
   CONVERT(datetime, '2010-07-25T13:50:38.544', 126) AS UsingConvertFrom_ISO8601  
FROM dbo.DimCustomer;  

Voici l'ensemble des résultats.

UnconvertedText UsingCast UsingConvertFrom_ISO8601

----------------------- ----------------------- ------------------------

2010-07-25T13:50:38.544 07/25/2010 1:50:38 PM 07/25/2010 1:50:38 PM

Conversion de Type de données ( ; le moteur de base de données ) ;
SÉLECTIONNEZ ( ; Transact-SQL ) ;
Fonctions système ( ; Transact-SQL ) ;
Rédiger des instructions Transact-SQL internationales

Ajouts de la communauté

AJOUTER
Afficher: