SQL Error (245): Conversion failed when converting the nvarchar value '50%' to data type int

SQL Error (245): Conversion failed when converting the nvarchar value '50%' to data type 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 次,那么它会显示数据。同样,如果我将 Top 201 更改为 To 202,则会再次弹出错误消息。

任何建议都会很有帮助。

注:- 当我使用 where 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 table:

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 table:

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

现在您的数据已修复,您应该更容易实现 IsExcess 的逻辑。