Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将nvarchar值转换为数据类型int时转换失败-错误消息_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

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

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

我的查询

该表由30万行组成。 它运行200k+行,并弹出此错误

如何处理此问题以获取完整数据


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))?