CONVERT, CAST, ou PARSE ?

Quelle fonction pour changer de type ?

Si vous hésitez entre les ces trois fonctions de conversion explicite de données, et leur équivalent avec TRY, vous n’êtes pas le seul!

Pour chaque fonction, il existe son équivalent qui commence par TRY_, et qui fait exactement la même conversion que la fonction sans TRY_, mais si la conversion échoue, il n’y a pas de message d’erreur – simplement, le résultat de la conversion sera NULL.

Voici des points de comparaison, pour vous aider à choisir, ou à mieux distinguer les points forts et faibles de chacune:

Syntaxe

PARSE ( string_value AS data_type [ USING culture ] )
TRY_PARSE ( string_value AS data_type [ USING culture ] )
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
TRY_CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
CAST ( expression AS data_type [ ( length ) ] ) 
TRY_CAST ( expression AS data_type [ ( length ) ] )

Existe depuis…

CONVERT et CAST existent depuis SQL Server 2008
Toutes les autres (PARSE et TRY_PARSE, TRY_CONVERT, TRY_CAST) ont été introduites dans SQL Server 2012

Convertit

PARSE convertit uniquement du type string, vers les types dates ou nombres.
CAST et CONVERT convertissent de tout type vers un autre type – pourvu que la conversion soit possible!

Exemples

SELECT PARSE('09/07/2018' AS DATE USING 'fr-FR') as DateFR
SELECT CONVERT(DATE, '09/07/2018', 103) as DateFR
SELECT CAST('07:35' as TIME) as TimeGen

Avantages

PARSE: Accepte un paramètre culture, littéral (ex. ‘en-US’, ‘fr-CA’), facilement compréhensible.

Large plage de valeurs d’entrée converties avec succès – réussit des conversions sur lesquelles les deux autres fonctions échouent.

CONVERT accepte un paramètre style, numérique, pour indiquer le format souhaité en sortie. Ce paramètre est utile, mais bien plus “cryptique” que celui de PARSE.

CAST ne prend pas d’autres paramètres que la valeur a convertir, et le type cible. Il a l’avantage d’avoir une syntaxe simple.

Désavantages

PARSE: Convertit peu de types de données (uniquement string accepté en entrée).

CONVERT n’est pas prevue par le standard ISO, comme l’est CAST.

Pour CAST, il n’y a aucun moyen de préciser le format des données d’entrée.

Performances

PARSE est la plus coûteuse en termes de performance, car n’est pas une fonction native SQL, mais dépend du CLR .Net. Elle nécessite que le CLR se trouve sur le serveur SQL.

CONVERT et CAST sont aussi performantes l’une que l’autre.

Et pour résumer…

Les équivalents avec TRY – TRY_PARSE, TRY_CONVERT et TRY_CAST – retournent NULL si la conversion échoue, plutôt que générer un message d’erreur (comme le fait leur équivalent sans TRY).

Privilégiez l’utilisation de (TRY_)CONVERT et (TRY_)CAST, pour des raisons de performance.

Références:
Article exhaustif sur les conversions de types de données
Détails sur CONVERT et CAST
La fiche de la fonction PARSE