微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL错误245:将nvarchar值“ 50%”转换为数据类型int时转换失败

如何解决SQL错误245:将nvarchar值“ 50%”转换为数据类型int时转换失败

定义

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

数据

enter image description here

查询

select top 200 * from dbo.FO_Entry
where isexceeds>0
order by Rec_Num desc

上面的查询工作正常并显示数据。但是,当我将前200个更改为201时,则会引发以下错误

enter image description here

如果我运行Top 201语句2或3次,它将显示数据。再一次,如果我将“前201”更改为“ 202”,则会再次弹出错误消息。

任何建议都会很有帮助。

注意:- 当我在 IsExceeds> 0 条件下使用时会出现问题。另外,我相信IsExceeds的计算可能会导致此问题。

解决方法

真正的问题是您的设计,解决问题,然后问题消失了。您的列Pro_PCT显然是int,而您的列Max_off显然是decimal;因为它是一个百分比。

我们将首先修复Pro_Pct。首先检查是否有任何值是“坏的”(我不会怀疑这是因为您将数字数据存储为nvarchar):

SELECT YourIdColumn
       Pro_PCT
FROM dbo.YourTable
WHERE TRY_CONVERT(int,Pro_PCT) IS NULL
  AND Pro_PCT IS NOT NULL;

这将为您提供所有不良数据的数据集。您需要修复所有这些值的所有

之后,您可以ALTER表格:

ALTER TABLE dbo.YourTable ALTER COLUMN ProPCT int NULL; --Change to NOT NULL as appropriate

现在百分比。首先,我们需要删除所有百分比('%')字符,然后将值转换为decimal。再次,让我们获取不良数据:

SELECT YourIDColumn,[Max_Off]
FROM dbo.YourTable
WHERE TRY_CONVERT(decimal(10,4),REPLACE(Max_Off,N'%',N''))
  AND Max_Off IS NOT NULL;

再次,修复所有无法转换的值。然后,您可以UPDATE的值,然后ALTER表:

UPDATE dbo.YourTable
SET Max_Off = TRY_CONVERT(decimal(6,N'')) / 100.00
GO
ALTER TABLE dbo.YourTable ALTER COLUMN Max_Off decimal(6,4) NOT NUll; --Again,change to NULL if needed

现在您的数据已固定,您应该有一个更轻松的时间来实现IsExcess的逻辑。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。