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

问题描述 投票:0回答:2

我正在尝试编写一个包含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.
sql sql-server sql-update case-statement
2个回答
0
投票

我想你正在尝试将'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 ..

0
投票

问题: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)以解决上述错误。

© www.soinside.com 2019 - 2024. All rights reserved.