оператор обновления с преобразованием типа данных оператора case

#sql #sql-server #sql-update #case-statement

#sql #sql-сервер #sql-update #оператор case

Вопрос:

Я пытаюсь написать 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 условие оператора равно false, значение SCIENCE_TH должно быть обновлено как SCIENCE_TH . Но я получаю сообщение об ошибке как ::

 Arithmetic overflow error converting expression to data type nvarchar.
The statement has been terminated.
  

Комментарии:

1. Покажите нам данные…

2. Когда я пытаюсь создать подобный оператор, я всегда начинаю с запроса select, пока не проверю правильность значений, генерируемых для обновления. Затем вы можете разбить вычисление на более мелкие фрагменты, чтобы определить, в чем проблемы.

Ответ №1:

Я думаю, вы пытаетесь обновить ‘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 ..
  

Комментарии:

1. Я не думаю, что это относится к CAST и VARCHAR вместе. Я попытался смоделировать, чтобы уточнить ваше предложение здесь: rextester.com/FEKA94560 . Пожалуйста, посмотрите и поправьте меня, если я ошибаюсь :).

Ответ №2:

Проблема: тип данных для nvarchar SCIENCE_TH (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), чтобы устранить вышеуказанную ошибку.