Это означает, что у вас есть хотя бы одна строка в таблице, которую нельзя привести к float
. Выполнение CASE
безопасно, но объединение CTE и добавление предложения WHERE впадает в общую ошибку программистов при написании T-SQL: такой порядок объявления подразумевает порядок выполнения . Программисты привыкли к императивному процессуальному стилю C-подобных языков и не в состоянии постичь декларативную множественную природу SQL. Я уже писал об этой проблеме и приводил примеры, когда ошибка вызывает ошибки:
Как только вы опубликуете свой полный код, мы увидим, где именно вы допустили ошибку в вашем случае и приняли определенный порядок исполнения.
после обновления
ОК, поэтому я должен сообщить администратору, что в вашем случае код является правильным в порядке выполнения, столбец result
нельзя спроецировать без предварительной оценки CASE
. Если бы дело было в предложении WHERE, все было бы иначе.
Ваша проблема в другом: ISNUMERIC
. Эта функция очень хорошо понимает, что означает NUMERIC
, и укусила многих разработчиков раньше. А именно, он принимает значения, которые CAST и CONVERT отклонят. Как те, которые содержат запятую:
declare @n varchar(8000) = '1,000';
select isnumeric(@n);
select cast(@n as float);
select case when isnumeric(@n)=1 then cast(@n as float) else null end;
Итак, у вас есть значения, которые проходят тест ISNUMERIC
, но не преобразуются. Просто на голову, чем больше вы будете копаться в этом подходе, тем больше закрытых дверей вы найдете. Это просто не безопасный способ сделать то, что вам нужно на стороне сервера. В идеале исправьте модель данных (сделайте поле плавающим, если оно хранит плавающие числа). Если не считать этого, выполните сортировку данных и удалите все значения, которые не являются правильными, и исправьте интерфейс / приложение, чтобы он больше не вводил новые, затем добавьте ограничение, которое вызовет ошибку, если появятся новые неверные значения. Вы не сможете решить это в запросе, эта дорога усеяна телами.
В следующей версии SQL Server у вас будет новая функция TRY_CONVERT
, которая решит вашу проблему.