Try_Convert pour SQL Server 2008 R2
Je suis à l'aide de SQL Server 2008 R2 et un VARCHAR
colonne je veux convertir à DECIMAL(28,10)
à l'aide de CONVERT
. Mais beaucoup de ces lignes sont mal formatés, de sorte qu'il n'est pas possible d'analyser un certain nombre. Dans ce cas, je veux juste sauter par ceux réglé à 0 ou NULL.
Je sais qu'il y est une nouvelle déclaration dans SQL Server 2012 (TRY_CONVERT()
) qui serait à portée de main.
Est-ce possible en 2008 ou dois-je attendre jusqu'à ce que nous avons mise à jour à la prochaine version de SQL 2012?
MODIFIER
Malheureusement ISNUMERIC()
n'est pas fiable dans ce cas.
J'ai essayé
ISNUMERIC(myCol) = 1
Qui retourne vrai pour les lignes qui CONVERT
n'est pas en mesure de convertir au DECIMAL
.
- Dupliquer: stackoverflow.com/a/2000061/2524304
- Êtes-vous désireux de convertir la colonne de façon permanente dans le tableau, ou juste dans un jeu de résultats?
- double possible de TSQL - Cast chaîne en entier ou de retour de la valeur par défaut
- Je veux mettre à jour permanente colonne décimale d'une colonne de type varchar.
- Oui, ISNUMERIC est un Microsoft cerveau-prout. Ne l'utilisez pas - jamais
- Avez-vous vérifier ma réponse?
- Oui, mais ma propre réponse a été utilisé
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de XML dans SQL Server, vous pouvez essayer cast vers un type de données et de recevoir des valeurs null où la conversion échoue.
Résultat:
Puisque c'est à un changement permanent, alors je le ferais comme un processus en deux étapes - d'abord, supprimer les invalides de texte, puis de le convertir la colonne.
Pour supprimer les invalides de texte, je ferais quelque chose comme:
Après cela est fait, tout ce qui reste doit être convertible en changeant juste la définition de la colonne
Vous pouvez écrire votre propre parser en C# et de l'utilisation SQLCLR, en utilisant par exemple
Décimal.Parse()
. Ne pas atempt à utiliserISNUMERIC
, est notoirement incorrect (renvoie VRAI pour les chaînes qui ne parviennent pas à jeter).ISNUMERIC
n'est pas incorrect, c'est juste, répond à une question que personne ne fait vraiment veut une réponse ("puis-je convertir cette chaîne de aucun des types de données numériques?")Enfin trouvé comment faire avec l'aide de telle ou Google.
L'instruction de mise à jour:
D'abord, je recherche pour % char comme la plupart du temps, qui est utilisé comme un marqueur de l'percentvalue. Mais il est également aléatoire d'autres utilisations. Il s'est avéré que ISNUMERIC n'était pas fiable dans mon cas.
Ce vraiment faire la différence, c'est l'appel à la procédure stockée isreallynumeric de ici.
Donc
1
(un espace après le nombre),+1
. Selon vos besoins, ils pourraient ne pas être des faux négatifs, bien sûr. Je suis le seul à les appeler ainsi parce que 1) votre fonction les résultats sont incompatibles avecISNUMERIC
's, et 2) ces cas serait de convertir d'un type numérique sans problèmes.J'ai écrit une utile fonction scalaire pour simuler la TRY_CAST fonction de SQL SERVER 2012 SQL Server 2008.
CODE DE LA FONCTION:
Pour l'instant uniquement en charge les types de données INT, DATE, DATETIME, NUMÉRIQUE, BITS et FLOAT. Vous pouvez trouver la dernière versión de ce code dans le lien suivant ci-dessous et nous aider les uns les autres afin de l'améliorer. TRY_CAST Fonction pour SQL Server 2008 https://gist.github.com/jotapardo/800881eba8c5072eb8d99ce6eb74c8bb
SELECT dbo.TRY_CAST('+', 'INT', 0)
donnera Msg 8114, Niveau 16, État 5, la Ligne 16 de l'Erreur de conversion de type de données varchar en float.Je préfère les solutions simples et fait une SP comme suit.
et l'a utilisé comme suit
2019 et toujours en utilisant un 2008 serveur, donc j'ai eu la même question. Le ci-dessus a fonctionné pour moi.
SQL SERVER 2008 R2 ont une fonction TRY_CAST mais si vous avez vos config DB avec la compatibilité de 2005 que vous avez trouvé que SQL SERVER pas le reconnaître.
J'ai utilisé la fonction qui créer @jotapardo mais renommer TRY_CAST2 parce que les SS dans ce cas reconnu de la fonction.