#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), чтобы устранить вышеуказанную ошибку.