MS SQL Conversion failed when converting the nvarchar value '??????' to data type int

Выполняю следующий простой запрос:

      WITH tt1 AS(
        SELECT CASE WHEN try_cast(QuestionDetailValue as int) IS NULL THEN N'Bad' ELSE N'Ok' END AS TryCast
        FROM vw.Rates)
SELECT TryCast 
FROM tt1
--WHERE TryCast = N'Bad'

Результатом выполнения данного запроса является только ответ 'Ok', что говорит о том, что в столбце QuestionDetailValue содержатся только числовые значения. Также, я пробовал достать DISTINCT QuestionDetailValue. Результатом являются числа от 0 до 10. И это правильно.

Но как только я раскомментирую фильтр WHERE и попробую отфильтровать, скажем, значения >= 9, выскакивает ошибка:

"Сообщение 245, уровень 16, состояние 1, строка 225 Conversion failed when converting the nvarchar value '??????' to data type int."

И что бы я ни делал, я не могу её пропустить. Я пробовал TRY_CAST, TRY_CONVERT, CASE WHEN, CAST, CONVERT и прочее. Но я не могу никаким известным мне способом эту ошибку обойти.

И что самое главное - я не могу поймать строчку с этой ошибкой. Её просто нет. Фильтр по этим символам выдаёт просто эту же ошибку, и всё. Соответственно, по этой же причине я не могу скинуть сюда примерный CREATE TABLE, потому что я не могу поймать эти символы.

Подскажите, что можно сделать?


Ответы (2 шт):

Автор решения: Yitzhak Khabinsky

Попробуйте следующее решение.

SQL

-- DDL and sample data population, start
DECLARE @Rates TABLE  (ID INT IDENTITY PRIMARY KEY, QuestionDetailValue NVARCHAR(255));
INSERT INTO @Rates VALUES 
(N'10'), 
(N'??????');
-- DDL and sample data population, end

SELECT * 
FROM @Rates
    CROSS APPLY (VALUES (IIF(TRY_CAST(QuestionDetailValue AS INT) IS NULL, N'Bad', N'Ok'))) AS t(c)
--WHERE c = N'Bad';

Результат

+----+---------------------+-----+
| ID | QuestionDetailValue |  c  |
+----+---------------------+-----+
|  1 | 10                  | Ok  |
|  2 | ??????       | Bad |
+----+---------------------+-----+

После раскомментирования предложения WHERE

+----+---------------------+-----+
| ID | QuestionDetailValue |  c  |
+----+---------------------+-----+
|  2 | ??????       | Bad |
+----+---------------------+-----+
→ Ссылка
Автор решения: Герман Борисов

SELECT COUNT(QuestionDetailvalue) from tt1 where QuestionDetailValue >= 9

"Сообщение 245, уровень 16, состояние 1, строка 225 Conversion failed when converting the nvarchar value '??????' to data type int."

Вероятнее всего вам нужно использовать запрос с таким условием:

where try_cast(QuestionDetailValue as int) >= 9
→ Ссылка