将数据类型varchar转换为float时出错

时间:2013-02-19 07:27:22

标签: sql sql-server tsql

在SO上搜索和搜索,无法弄明白 尝试将每个字段作为FLOAT进行铸造无济于事,转换并没有让我更进一步 如何获得以下case子句以返回THEN部分中所述的值?

错误: Msg 8114,Level 16,State 5,Line 1 将数据类型varchar转换为float时出错。

我的SQL查询部分导致错误:

When cust_trendd_w_costsv.terms_code like '%[%]%' and (prod.dbo.BTYS2012.average_days_pay) - (substring(cust_trendd_w_costsv.terms_code,3,2)) <= 5 THEN prod.dbo.cust_trendd_w_costsv.terms_code

average_days_pay = float
terms_code = char

干杯!

3 个答案:

答案 0 :(得分:8)

尝试使用ISNUMERIC来处理无法转换的字符串:

When cust_trendd_w_costsv.terms_code like '%[%]%' 
and (prod.dbo.BTYS2012.average_days_pay) - 

(case when isnumeric(substring(cust_trendd_w_costsv.terms_code,3,2))=1 
         then cast(substring(cust_trendd_w_costsv.terms_code,3,2) as float)
         else 0
 end)
<= 5 THEN prod.dbo.cust_trendd_w_costsv.terms_code

答案 1 :(得分:3)

您遇到的问题是您专门搜索包含%字符的字符串,然后将它们(隐式或显式)转换为float。

但是包含%符号的字符串无法转换为浮点数,但它们中仍然包含%。这也会产生错误:

select CONVERT(float,'12.5%')

如果您想要转换为浮点数,则需要首先移除%符号,例如:

CONVERT(float,REPLACE(terms_code,'%',''))

将消除它。我不确定您的terms_code列中是否还有其他字符可能会将其绊倒。

您还需要注意,SQL Server可以非常积极地重新排序操作,因此可以尝试对terms_code中的其他字符串进行上述转换,即使那些不包含%的字符串也是如此。如果这是您的错误的来源,那么您需要防止这种积极的重新排序。如果没有涉及聚合,CASE表达式通常可以避免最严重的问题 - 确保在您尝试之前,之前的WHEN子句消除了您不想处理的所有字符串你的转换

答案 2 :(得分:1)

如果你确定Substring Part返回一个数值,你可以将子串(....)转换为Float:

 .....and (prod.dbo.BTYS2012.average_days_pay) - (CAST(substring(cust_trendd_w_costsv.terms_code,3,2)) as float ) <= 5 ....