Sql 将nvarchar值转换为数据类型int时转换失败-错误消息
我的查询 该表由30万行组成。 它运行200k+行,并弹出此错误 如何处理此问题以获取完整数据Sql 将nvarchar值转换为数据类型int时转换失败-错误消息,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我的查询 该表由30万行组成。 它运行200k+行,并弹出此错误 如何处理此问题以获取完整数据 MyTable是否有任何计算列 表格由一个名为IsExceeds的计算列组成,下面给出了该列供您参考。 这是计算列公式: 字段定义: 根据公式,Pro\u PCT或Max\u Off包含值11.11(当然,对于Max\u Off,还有一个额外的%。可能它们还包含其他无法转换为int的值 以下是查找将导致此问题的所有行的方法: Select * from MyTable where try_cas
MyTable是否有任何计算列 表格由一个名为IsExceeds的计算列组成,下面给出了该列供您参考。 这是计算列公式: 字段定义:
根据公式,
Pro\u PCT
或Max\u Off
包含值11.11
(当然,对于Max\u 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\u cast
或try\u convert
而不是基于公式的convert
,Pro\u PCT
或Max\u Off
包含值11.11
(好吧,对于Max\u 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\u cast
或try\u convert
而不是convert
检查错误数据
select * from MyTable where isnumeric( Max_Off ) = 0
检查坏数据,并使用
select * from MyTable where isnumeric( Max_Off ) = 0
请先转换成浮点数,然后再转换成整数
declare @n nvarchar(20)
set @n='11.11'
if (isnumeric(@n)=0)
SELECT 0
else
SELECT CAST(CONVERT(float, @n) as int) AS n
请先转换成浮点数,然后再转换成整数
declare @n nvarchar(20)
set @n='11.11'
if (isnumeric(@n)=0)
SELECT 0
else
SELECT CAST(CONVERT(float, @n) as int) AS n
为什么要将金额存储为字符串?这是根本问题 因此,我建议修复您的数据。如下所示:
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)
瞧!没问题。为什么要将金额存储为字符串?这是根本问题 因此,我建议修复您的数据。如下所示:
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)
瞧!没问题。MyTable是否有任何计算列?最好共享表定义。请不要添加不相关的标记。数据类型只能存储整数,这是显而易见的。您正在尝试将11.11转换为int,这是不可能的。您应该将数据类型定义为float、double,…除非有必要计算列(未持久化)在表定义中,我看不出仅此查询如何产生此错误。我们需要查看计算本身及其引用的任何列的定义,而不仅仅是显示它确实已计算的图像。最好是删除所有不相关列的
CREATE table
语句,最好是作为文本而不是image.MyTable是否有计算列?最好共享表定义。请不要添加不相关的标记。数据类型只能存储整数,这一点很明显。您试图将11.11转换为整数,这是不可能的。您应该将数据类型定义为float、double,…除非有计算列(未持续)在表定义中,我看不出仅此查询如何产生此错误。我们需要查看计算本身及其引用的任何列的定义,而不仅仅是显示它确实已计算的图像。最好是删除所有不相关列的CREATE table
语句,最好是作为文本而不是image。如果告诉您11.11
是数字的,那就太好了。因为isnumeric
回答了一个任何正常人都不想问的问题。我同意,但在尝试快速查看不良数据时,这仍然很有帮助。最好从isnumeric(Max\u Off)所在的MyTable中选择distinct(Max\u Off)=0。但我想这实际上取决于数据的真实性如何。是的,但是isnumeric
不能保证值可以转换为int。事实上,它甚至不能保证它可以直接转换为任何sql server数字数据类型。如果告诉您11.11
是数字,那就绝对好了。因为isnumeric
回答了一个任何理智的人都不想问的问题。我同意这一点,但在尝试快速查看不良数据时,它仍然有帮助。最好从isnumeric(Max\u Off)所在的MyTable中选择distinct(Max\u Off)=0。但我想这实际上取决于数据的真实性。是的,但是isnumeric
不能保证值可以转换为int。事实上,它甚至不能保证它可以直接转换为任何sql server数字数据类型。这没什么大不了的,但是最好不要混合使用CAST和CONVERT。坚持使用其中的1个然后使用它。执行两次强制转换或两次转换。有什么具体原因让你同时使用它们吗?CONVERT(float,@n)返回11.11,CAST(CONVERT(float,@n)as int)返回11为什么不强制转换(CAST(@n as float)as int)或CONVERT(int,CONVERT(float,@n))这没什么大不了的,但是最好不要混合使用CAST和CONVERT。坚持使用其中的一个。做两次或两次转换。有什么具体的原因让你同时使用它们吗?CONVERT(float,@n)返回11.11,CAST(CONVERT(float,@n)as int)返回11为什么不将CAST(CAST(@n as float)as int)或CONVERT(int,CONVERT)呢(float,@n))?