"转换为int"时出错当转换为十进制时

时间:2018-05-18 18:49:33

标签: sql sql-server tsql

为什么在转换为十进制时会收到涉及数据类型INT的错误消息?

SELECT
    a.number, --nvarchar
    b.number  --nvarchar
FROM
    TableA AS a
    TableB AS b
WHERE
    CAST(COALESCE(a.number, 0), AS DECIMAL(10,2)) <> CAST(COALESCE(b.number, 0), AS DECIMAL(10,2))

错误:

  

Msg 245,Level 16,State 1,Line 156       转换nvarchar值时转换失败&#39; 78000.0&#39;到数据类型       中间体

3 个答案:

答案 0 :(得分:1)

这是因为coalesce期望a.number nvarchar0 int兼容。这就是转换失败的地方,因为nvarcharint不兼容。

0替换'0'可以解决问题:

CAST(COALESCE(a.number, `0`), AS DECIMAL(10,2))

注意:除非这是您无法控制的旧数据库,否则您应该考虑将number字段的类型更改为数字,例如, decimal(10,2)

答案 1 :(得分:1)

看起来是因为你在数字字段(nvarchar)和数字上做Coalese,你的0.将你的演员移动到Coalese内部(或者也可以施放nvarchar的列。

这样做会给我一个转换错误,因为你无法将字符串和数字联系起来

SELECT COALESCE('A', 0) -- errors out, and this is basically what your doing

SELECT
    a.number, --nvarchar
    b.number  --nvarchar
FROM
    TableA AS a
    TableB AS b
WHERE
COALESCE(CAST(a.number AS DECIMAL(10,2)), 0) <> COALESCE(CAST(b.number AS DECIMAL(10,2)), 0)

答案 2 :(得分:-2)

问题在于您尝试转换的数据类型,此字段包含非数字记录,因此必须在条件中添加密钥“ISNUMERIC”:

SELECT
a.number, --nvarchar
b.number  --nvarchar
FROM
TableA AS a
TableB AS b
WHERE
CAST(COALESCE(ISNUMERIC(a.number)), 0), AS DECIMAL(10,2)) <> CAST(COALESCE(ISNUMERIC(b.number), 0), AS DECIMAL(10,2))