VARCHAR DÉCIMAL
Je veux convertir un varchar(max)
colonne de decimal(10,4)
.
Lorsque j'essaie d'utiliser cast
ou convert
je reçois un dépassement de capacité arithmétique exception. Le problème est que les données stockées dans la colonne de type varchar peut contenir des précisions différentes et à différentes échelles. Par exemple, 123456789.1234567', 1.12345678 ou 123456.1234.
Pour des valeurs comme 123456.1234 c'est la conversion avec toute la question, mais pour d'autres valeurs que je vais avoir quelques problèmes.
Toute aide serait appréciée.
- Comment voulez-vous que
123456789.1234567
pour s'adapter à unDECIMAL(10,4)
? - Il faut être un nombre Décimal ou pourriez-vous utiliser un float ou un type de Données Real à la place: msdn.microsoft.com/en-us/library/ms173773.aspx
- si il rentre pas alors je veux identité. juste besoin comme try_parse dans sql 2012 mais malheureusement la version de sql server 2008
- et quel est le problème que vous avez avec les autres valeurs?
- L'obtention de l'arithmétique erreur de dépassement de capacité
Vous devez vous connecter pour publier un commentaire.
Après essais, j'ai trouvé que ce n'était pas la virgule qui a été à l'origine du problème, c'était la précision (10)
Cela ne fonctionne pas: erreur de dépassement Arithmétique de la conversion de type varchar pour les données de type numérique.
Cela a fonctionné
Mon explication est dans le code. 🙂
Il vous manque le fait que 6.999,50 n'est pas un nombre décimal valide. Vous ne pouvez pas avoir une virgule et un point décimal en une valeur décimale sûrement? Ce nombre est-il censé être?
En supposant que vos paramètres régionaux précise . en tant que groupement et , en tant que séparateur décimal: Pour supprimer le groupement des chiffres:
SÉLECTIONNEZ CONVERTIR(décimal(11,2), REMPLACER('6.999,50', '.', "))
donnera 6999,50 comme un nombre décimal
Vous allez avoir à tronquer les valeurs vous-même comme des chaînes de caractères avant de les mettre dans cette colonne.
Sinon, si vous voulez plus de décimales, vous aurez besoin de changer votre déclaration de la colonne decimal.
Je suis venu avec la solution suivante:
Je sais que cela semble exagéré, et il est probablement, mais cela fonctionne pour moi (vérifié à la fois positifs, négatifs, les gros et les petits nombres de différentes précision et l'échelle - tout est converti à
decimal(38,10)
ouNULL
).Il est codé en dur pour
decimal(38,10)
type, donc si vous avez besoin de différentes précision, de modifier les constantes dans le code (38, 10, 29).Comment ça marche? Le résultat est:
chaque cas est séparé LORS de l'instruction dans le code ci-dessus.
Voici quelques exemples de conversion:
Vous n'avez toujours pas expliqué pourquoi vous ne pouvez pas utiliser un type de données Float, donc voici un exemple:
Votre principal problème n'est pas le truc à droite de la virgule, c'est le truc à gauche. Les deux valeurs dans votre déclaration de type de précision et l'échelle.
Si vous spécifiez (10, 4), cela signifie que vous ne pouvez stocker qu'6 chiffres à gauche du séparateur décimal, ou un nombre maximum de 999999.9999. Quelque chose de plus grand que cela va provoquer un dépassement de capacité.
Mis en œuvre à l'aide de la Fonction Personnalisée.
Cela permettra de vérifier si la chaîne de valeur peut être converti en Décimal en toute sécurité
Je sais que c'est une vieille question, mais le projet de Loi semble être le seul qui a fait ", a Expliqué" le problème. Tout le monde semble être à venir avec des solutions complexes pour une utilisation abusive d'une déclaration.
...
Donc, si vous déclarez
DECIMAL(10,4)
vous pouvez avoir un total de 10 numéros, avec 4 de venir APRÈS le point décimal.donc 123456.1234 a 10 chiffres, 4 après le point décimal. Qui va aller dans les paramètres de
DECIMAL(10,4)
.1234567.1234 lèvera une erreur. il y a 11 chiffres à rentrer dans les 10 chiffres et de l'espace, et 4 chiffres DOIVENT être utilisées APRÈS le point décimal. La coupe d'un chiffre au large de la côté gauche de la virgule n'est pas une option.
Si votre 11 caractères ont été 123456.12345, ce ne serait pas jeter une erreur que le règlage(Arrondi) à partir de la fin d'une valeur décimale est acceptable.
Lors de la déclaration de décimales, toujours essayer de déclarer le maximum de ce que votre colonne de l'utiliser de façon réaliste et le nombre maximal de décimales que vous souhaitez voir.
Donc, si votre colonne de ne jamais afficher les valeurs avec un maximum de 1 million de dollars et vous ne se soucient que les deux premières décimales, déclarer que
DECIMAL(9,2)
.Cela vous donnera un nombre maximum de 9,999,999.99 avant, une erreur est renvoyée.
Comprendre le problème avant d'essayer de le réparer, sera de vous assurer de choisir une solution adéquate à votre situation, et vous aider à comprendre la raison pour laquelle la correction est nécessaire /œuvres.
Encore une fois, je sais que j'ai cinq ans de retard à la fête.
Cependant, mes deux cents sur une solution pour ce faire, (à en juger par vos commentaires que la colonne est déjà
DECIMAL(10,4)
et ne peut pas être changé)La plus simple façon de le faire serait de deux étapes.
Vérifiez que votre décimal n'est pas à plus de 10 points d'écart, puis couper à 10 chiffres.
La raison que j'ai laissé comme une chaîne de caractères est de sorte que vous pouvez traiter avec les valeurs qui sont plus de 10 chiffres à gauche du séparateur décimal.
Mais c'est un début.
Dans le cas où vous avez besoin d'arrondir le résultat, ne pas tronquer, pouvez utiliser ceci:
sélectionnez convertir(décimal(38,4),round ((convertir en décimal(38,10),'123456789.1234567'),4))
Ce retourne:
'123456789.1235" pour "123456789.1234567'
'123456789.1234" pour "123456789.1234467'