2015-02-26 2 views
0

У меня есть хранимая процедура, в которой у меня есть условие, чтобы проверить, является ли рейтинговый код 1,2 или 3 в предложении where. Что-то вроде этого:проверка недопустимых значений sql

WHERE 
CONVERT(INT, LEFT(RatingCode, 1)) IN (1,2,3) AND 

Иногда, когда есть плохие значения в столбце RatingCode выше строка выдает ошибку. Поэтому я придумал решение ниже:

WHERE 
CASE WHEN ISNUMERIC(LEFT(RatingCode, 1)) = 1 
    THEN CASE WHEN CONVERT(INT, LEFT(RatingCode, 1)) IN (1,2,3) 
      THEN 1 
      ELSE 0 
     END 
    ELSE 0 
END = 1 AND 

Здесь, если есть недопустимое значение (нечисловой) в колонке RatingCode, то я хочу, чтобы игнорировать эту запись. Является ли это мое решение хорошим? Или есть лучшее решение?

+0

Можете подумать о том, чтобы предотвратить вставку плохих данных, чтобы вам не пришлось реализовывать такое обходное решение. – Kritner

+1

@Kritner Это управляется отдельной группой и занимает более 10 минут. Я не хочу, чтобы мой код терпел неудачу за недопустимое значение, когда исправление в 10 минут может решить это. – user793468

ответ

2

В этом конкретном случае, вы могли бы просто использовать

WHERE 
LEFT(RatingCode, 1) IN ('1','2','3') AND 

Кроме того, также сравнения строк разрешены в tsql.

WHERE 
LEFT(RatingCode, 1) BETWEEN '1' AND '3' AND 

Это не вызывает ошибку для нечисловых букв.