Eh bien, il n'y a pas de TRY_CONVERT()
ou TRY_CAST()
dans SQL-Server 2008, mais vous pouvez utiliser les conversions internes de XML en types nullables.
Essayez ceci
DECLARE @tbl TABLE(SomeInt VARCHAR(100));
INSERT INTO @tbl VALUES('123')
,('blah') --bad data
SELECT t.*
,CAST('' AS XML).value('sql:column("t.SomeInt") cast as xs:int?','int')
FROM @tbl t;
Un peu un hack... Mais en quelque sorte magnifique;-)
Quelques explications
Le CAST('' AS XML)
est juste une astuce pour obtenir un vrai XML afin d'utiliser les méthodes natives de XML. Le sql:column()
est une XQuery
-fonction, qui vous permet d'inclure la colonne d'un ensemble dans le XQuery
(utilisez sql:variable
pour les variables).
Le cast as xs:int?
essaiera d'analyser la chaîne en tant que valeur int et renverra NULL si cela ne fonctionne pas.
La limite est :cela utilisera toujours les valeurs par défaut de votre système (similaire à TRY_CAST
). Avec TRY_CONVERT
vous auriez plus de contrôle sur la sortie avec le troisième paramètre...
Indice :XQuery/Xpath
est strictement sensible à la casse. Il y a donc xs:dateTime?
, mais vous obtiendrez une erreur avec xs:datetime
...