如何解决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],'%','')))
数据
select top 200 * from dbo.FO_Entry
where isexceeds>0
order by Rec_Num desc
上面的查询工作正常并显示数据。但是,当我将前200个更改为201时,则会引发以下错误。
如果我运行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 举报,一经查实,本站将立刻删除。