обновление оператора с преобразованием типа данных регистра - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь написать оператор 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.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Проблема: Тип данных для SCIENCE_TH - это nvarchar (2), а SCIENCE_TTL - это nvarchar (3). Сообщение об ошибке указывает на переполнение при преобразованиивыражение для типа данных nvarchar (здесь это может быть значение numeric длины 3, так как базовый столбец 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) для устранения вышеуказанной ошибки.

0 голосов
/ 12 апреля 2019

Я думаю, что вы пытаетесь обновить 'xx.xx' до varchar (2) (поскольку вывод арифметической операции с двумя числами будет числовым, а не целым числом), что невозможно. Итак, я взял левую 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 ..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...