带有case语句数据类型转换的update语句

时间:2019-04-12 02:58:05

标签: sql sql-server sql-update case-statement

我正在尝试编写包含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.

2 个答案:

答案 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)即可解决上述错误。