Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2008 passant le type de données en tant que paramètre pour la fonction

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 ...