我正在尝试编写包含UPDATE
语句的CASE
语句
科学_TH的数据类型为nvarchar(2),科学_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
语句条件为false时,SCIENCE_TH
的值应更新为SCIENCE_TH
。但我收到错误消息:::
Arithmetic overflow error converting expression to data type nvarchar.
The statement has been terminated.
答案 0 :(得分:0)
我认为您正在尝试将“ xx.xx”更新为varchar(2)(因为对两个数字进行算术运算的输出将是数字,而不是整数),这是不可能的。因此,我选择了left 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 ..
答案 1 :(得分:0)
问题:SCIENCE_TH
的数据类型为nvarchar(2),SCIENCE_TTL
的数据类型为nvarchar(3)。错误消息表明存在溢出< / em>将表达式转换为数据类型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)即可解决上述错误。