将varchar转换为数字时出错

时间:2010-12-13 11:44:44

标签: sql

我的案例陈述存在问题。这是我的表格结构的摘录:

total = decimal(9,2)
selfrec = decimal(9,2)

这是给我提出问题的CASE陈述:

CASE
    WHEN Invoices.selfrec IS NOT NULL 
    THEN 'Self Reconcilation: ' + Invoices.total + ' - ' + Invoices.selfrec + ' = ' + Invoices.total - Invoices.selfrec ELSE Invoices.total 
END AS 'total'

当selfrec不为null时,它似乎尝试将诸如'Self Reconcilation:'之类的字符串转换为数字,显然会失败。为什么要这样做?

感谢。

3 个答案:

答案 0 :(得分:4)

你要离开它来推断一个基于字符串和数字的类型。给它一个提示:

ELSE CONVERT(varchar(30), Invoices.total)

然后它有varchar和varchar的选择,所以它知道这是从一开始就是varchar,并且不会出错。

答案 1 :(得分:3)

它实际上是在尝试将' = '等转换为数字以执行数字加法。您需要CAST数字到varchar。

答案 2 :(得分:3)

只需运行此行:

select 'Self Reconcilation: ' + Invoices.total + ' - ' + Invoices.selfrec + ' = ' + Invoices.total - Invoices.selfrec 

你会收到错误。您正尝试将数值隐式转换为varchar。

尝试以下方法。 Varchar(12)应该足以满足十进制(9,2)(九+二,一'代表'。')

select 'Self Reconcilation: ' + cast(Invoices.total as varchar(12)) + ' - ' + cast(Invoices.selfrec as varchar(12)) + ' = ' + cast(Invoices.total - Invoices.selfrec  as varchar(12))

给你:

CASE
    WHEN Invoices.selfrec IS NOT NULL 
        THEN 'Self Reconcilation: ' + cast(Invoices.total as varchar(12)) + ' - ' + cast(Invoices.selfrec as varchar(12)) + ' = ' + cast(Invoices.total - Invoices.selfrec as varchar(12))
    ELSE Invoices.total
END AS 'total'

另外,为什么不首先测试NULL。 else子句实际上是在说'if not not null'。 : - )