2011-07-27 196 views
-1

我做错了什么?有没有更好的方法做到这一点,打破长度和字符串并将其转换为数值?我越来越varchar数值错误?

UPDATE VF_CasINV_Cost 
    SET TotWgt = CASE 
     WHEN (Dimension like '%x%') THEN 
     (cast(left(Dimension, charindex('X', Dimension, 1) - 1) as numeric)) * 
     (cast(substring(Dimension, 1 + charindex('X', Dimension, 1), len(Dimension)) as numeric))/144.00 

     WHEN TotWgt = 0 and [Wt/Ft] > 0 THEN (Dimension * [Wt/Ft]) * [Count] 
     WHEN TotWgt = 0 and [Wt/Sht] > 0 THEN ((Dimension * [Wt/Sht])/100) * [Count] 
     WHEN TotWgt = 0 and [Wt/Pc] > 0 THEN ((Dimension * [Wt/Pc])/100) * [Count] 
     ELSE TotWgt 
    END --TotWgt, Item#, TotWgt, [Wt/Ft], [Wt/Sht], [Wt/Pc], [Count], Dimension, TotWgt 
FROM VF_CasINV_Cost 
WHERE (CalendarYear = 2010) AND (Item# = Item#) AND (ID = ID) AND (Item# < 99999990) 
AND K = 'K' AND D = '' AND C = '' AND (Unit = 'cwt' OR Unit = 'cwts') 
+2

你有GOT来简化它。我们不知道你的模式是什么样的,正在处理什么文本字符串等等。 – n8wrl

+1

你应该提供一个表格模式,以便明确哪一种类型的列是 – sll

回答

0

我会做一些假设:Dimension是一个varchar字段;你试图从这个varchar字段中解析出数值,并在计算中使用它。 如果是这样,你的问题是最后三个WHEN情况:你在乘法运算中使用Dimension而不投射它。所以SQL无法在varchar字段上执行乘法运算。

+0

当他们很容易看到时,它似乎他们是最难找到的 。谢谢!当TotWgt = 0并且[Wt/Ft]> 0 THEN(cast(尺寸为数值)* [Wt/Ft])* [Count] 当TotWgt = 0并且[Wt/Sht] >(0)[(cast(尺寸为数值)* [Wt/Sht])/ 100)* [Count] 当TotWgt = 0并且[Wt/Pc]> 0 THEN/Pc])/ 100)* [Count] 但我仍然得到varchar数值错误? – user823893

+0

如果维度与“d1782”类似,您将得到该错误。你必须从字符串解析数字值,然后执行转换 – Dimitri