将nvarchar值转换为数据类型int时转换失败-错误消息

时间:2019-03-14 07:42:30

标签: sql sql-server sql-server-2012

我的查询

Select * from MyTable

该表包含30万行。 它可以运行200k +行,并且会弹出此错误。

enter image description here

如何处理以获得完整数据?

  

MyTable是否有任何计算列?

表由一个名为IsExceeds的计算列组成,下面提供以供参考。

enter image description here

这是计算得出的列公式:

(CONVERT([int],[Pro_PCT])-CONVERT([int],replace([Max_Off],'%','')))

字段定义:

[Pro_PCT] [nvarchar](50) NULL,
[Max_Off] [nvarchar](50) NULL,
[IsExceeds]  AS (CONVERT([int],[Pro_PCT])-CONVERT([int],replace([Max_Off],'%','')))

4 个答案:

答案 0 :(得分:1)

请先将其转换为float,然后再转换为int。

declare @n nvarchar(20)
set @n='11.11'

if (isnumeric(@n)=0)
 SELECT 0
   else 
      SELECT CAST(CONVERT(float, @n) as int) AS n

答案 1 :(得分:1)

为什么将金额存储为字符串?这是根本问题。

因此,我建议您修复数据。像这样:

update mytable
    set max_off = replace(max_off, '%');

alter table mytable alter pro_pct numeric(10, 4);
alter table mytable alter max_off numeric(10, 4);

(没有示例数据或我只是在猜测合理类型的数据示例。)

然后,您可以将IsExceeds定义为:

(Pro_PCT - Max_Off)

Voila!没问题。

答案 2 :(得分:0)

基于公式-Pro_PCTMax_Off包含值11.11(好吧,%还有一个额外的Max_Off。也许它们还包含不能转换为int的其他值。

您可以在这里找到将导致此问题的所有行:

Select * 
from MyTable
where try_cast(Pro_PCT as int) is null
or try_cast(replace([Max_Off],'%','') as int) is null

找到它们之后,可以固定值或更改计算列的计算以使用try_casttry_convert而不是convert

答案 3 :(得分:0)

使用

检查错误数据
select  * from MyTable where isnumeric(  Max_Off ) = 0