2010-12-06 7 views
0

J'ai une instruction t-sql qui résume les valeurs varchar en les convertissant en décimales. Si aucune valeur n'existe, retourner 0.Comment convertir varchar en décimal lorsqu'aucune donnée de ligne n'existe

L'erreur que je reçois est "Erreur lors de la conversion du type de données varchar en numérique". Cela se produit uniquement lorsqu'aucune donnée de résultat n'est renvoyée.

select sum(convert(decimal(28,8), isnull(myColumn, 0))) 
from myTable 
//...multiple inner joins 
//...and multiple filter criteria 

Comme aucune donnée existe la solution de contournement je pensais faire un compte a été de sélection pour détecter si des lignes existent et faire la déclaration suivante. Y a-t-il de meilleures solutions pour cela?

Répondre

2

Toutes les réponses ci-dessous ne fonctionnent pas lorsque aucune donnée existe. Impossible de trouver une autre façon de faire autre chose que de faire un si existe.

Cela faisait partie d'un script sql beaucoup plus grand et cette partie spécifique mettait à jour une table temporaire.

if exists(select * from table inner join...where...) 
being 
    select sum(convert(decimal(28,8), isnull(myColumn, 0))) 
    from myTable 
    ...inner joins 
    ...where clause 
end 

Mise à jour

La vraie raison pour laquelle il a été erroring était à cause de la clause where où la conversion se passait, et erroring, sur les jointures avant la clause where est en cours d'exécution. Les jointures internes renvoyaient des valeurs nulles.

+0

Vous pouvez ajouter une autre instruction pour sélectionner 0 comme première colonne, 0 comme deuxième colonne, afin que vous obteniez un ensemble de résultats dans tous les cas. – HLGEM

1

Votre isnull est au mauvais endroit.

sum(convert(decimal(28,8),isnull(myColumn,0))) 

Convertissez la valeur nulle à 0, puis convertissez en nombre décimal, puis finalement en somme.

+0

Désolé que j'écrivais le sql du haut de ma tête et l'ai mal écrit. L'erreur se produit toujours lorsqu'aucune ligne n'est renvoyée. – David

+0

Je vais continuer à penser – JamieDainton

0
sum(convert(decimal(28,8), isnull(myColumn,'0')) 
+0

Incorrect - ne peut toujours pas convertir en l'absence de données. – David

+0

Je pense que dans ce cas, vous avez des caractères non valides dans cette colonne et que cela échoue, quand aucune donnée de résultat n'est retournée cette instruction fonctionne. Regardez les valeurs qui recherchent des caractères de séparation ou des caractères décimaux non valides qui, pour certains éléments locaux, peuvent être ',' pour d'autres '.'. Si aucune donnée n'est trouvée, l'instruction select n'est pas exécutée, de sorte que vous n'avez que des valeurs nulles. –

0

Pour la petite histoire, certains préfèrent COALESCE:

sum(convert(decimal(28,8), COALESCE(myColumn,'0')) 
+0

Incorrect - ne peut toujours pas convertir en l'absence de données. – David

+0

Pourriez-vous exécuter _select * depuis mytable_ et nous montrer les 20 premières lignes? – smirkingman

0

J'espère que cette requête pourrait vous aider

select isnull(sum(convert(decimal(28,8),isnull(myColumn,0))), 0) 
from myTable 
Questions connexes