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
的逻辑。
定义
[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
的逻辑。