我正在尝试编写一个包含UPDATE
语句的CASE
语句,其数据类型为science_TH为nvarchar(2),而SCIENCE_TTL为nvarchar(3)。
update STUDENT_MARKS_TEMP
set
SCIENCE_TH = CASE WHEN (SCIENCE_TTL <> 'Ab' AND try_convert(NUMERIC(38, 2), SCIENCE_TTL ) < 30.00 ) THEN (30.00 - try_convert(NUMERIC(38, 2), SCIENCE_TTL ) ) else SCIENCE_TH end
// remaining block ...
我想要做的是当case
语句条件为假时,SCIENCE_TH
的值应更新为SCIENCE_TH
。但我收到错误::
Arithmetic overflow error converting expression to data type nvarchar.
The statement has been terminated.
我想你正在尝试将'xx.xx'更新为varchar(2)(因为对两个数字的算术运算的输出将是数字,而不是int),这是不可能的。所以,我已经采取了左2,您可以根据数据更改是否正确2或左2,无论您想要哪个。理想情况下,如果数据需要,您应该增加大小。
SCIENCE_TH =
CASE
WHEN
(SCIENCE_TTL <> 'Ab'
AND try_convert(NUMERIC(38, 2), SCIENCE_TTL ) <
30.00) THEN
LEFT(CAST((30.00 - try_convert(NUMERIC(38, 2),
SCIENCE_TTL ) ) AS VARCHAR),2)
else
SCIENCE_TH
end
// remaining block ..
问题:SCIENCE_TH
的数据类型是nvarchar(2),SCIENCE_TTL
是nvarchar(3)。错误消息表明将表达式转换为数据类型nvarchar
时存在溢出(这里它可能是长度为3的numeric
值作为基本列SCIENCE_TTL
的长度为3)。
重现问题:
declare @T Table (SCIENCE_TH nvarchar(2), SCIENCE_TTL nvarchar(3))
insert into @T (SCIENCE_TTL) values ('1.1')
update @T
set SCIENCE_TH = (30.00 - try_convert(NUMERIC(38, 2), SCIENCE_TTL ) )
解决方案:确保NVARCHAR变量或列的长度足以保存数值,将小数点计算为转换后的NVARCHAR值的一部分。
将SCIENCE_TH
更改为最小nvarchar(5)以解决上述错误。