J'ai besoin d'écrire une fonction pour recevoir un caractère de chaîne et retourner le format de date. Par exemple, l'entrée est 20120101 et j'ai besoin de ce 2012-01-01. Le problème est qu'il peut y avoir des entrées incorrectes comme celle-ci "2012ABCD". Dans ce cas, je souhaite que la fonction renvoie une date fixe telle que 2020-01-01. Ce que j'ai écrit jusqu'à présent, c'est:
Create Function ReturnDate
(@date varchar(8))
Returns date
as
begin
declare @result date
set @result = (select convert(date , @date,111))
if(@@ROWCOUNT>0) return @result
else return '2020-01-01'
return @result
end
Cela ne fonctionne pas et je ne sais tout simplement pas comment gérer la deuxième partie (lorsque l'entrée est incorrecte).
sql-server
t-sql
functions
Pantea Tourang
la source
la source
yyyymmdd
format?Réponses:
Sur SQL Server 2012 et versions ultérieures, vous pouvez utiliser TRY_CONVERT pour vérifier si l'entrée peut être convertie. Si ce n'est pas le cas, une valeur NULL est renvoyée, vous pouvez alors faire un COALESCE pour obtenir la valeur convertie ou la date fixe.
Vous pouvez également utiliser un
TRY CATCH
bloc et renvoyer la date fixe dans leCATCH
bloc, mais il est recommandé d'utiliser TRY_CONVERT afin que SQL Server n'ait pas à gérer une erreur car cela nécessite plus de temps et de ressources.Une fonction pour ce type de code entraînera plus de surcharge que la simple utilisation de la même logique dans la requête, donc si elle est appelée plusieurs fois par seconde, vous risquez de consommer des ressources importantes en utilisant une fonction pour elle. Je comprends que cela peut être appelé à partir de nombreux morceaux de code, il y a donc un désir d'en faire une fonction au cas où la date par défaut devrait être changée - alors ce n'est pas un changement de code compilé et il suffit de mettre à jour cette fonction.
Si ce code va être exécuté beaucoup, vous devriez considérer d'autres options qui fourniront de meilleures performances qu'une fonction définie par l'utilisateur. Veuillez consulter la réponse de Salomon pour un aperçu de vos options et une explication supplémentaire de la raison pour laquelle vous pouvez choisir l'une plutôt que l'autre.
Par exemple, ce qui suit montre la même logique implémentée en tant que fonction de valeur de table en ligne, qui doit être utilisée avec
CROSS APPLY
si elle n'est pas fournie avec une valeur statique, mais fonctionne bien mieux qu'une UDF scalaire:la source
FINALLY
bloc dans T-SQL (je pense que vous vouliez direCATCH
). 2) vous devriez probablement mentionner que cela aTRY_CONVERT
commencé en 2012 (certaines personnes sont bloquées avant SQL Server 2012). 3) avez-vous envisagé un TVF en ligne? Ceux-ci n'ont pas les mêmes problèmes de performances que les FDU Scalar.