Да, к сожалению, не существует хорошего автоматического способа найти значение, которое является недопустимым для данного приведения.Вы в значительной степени застряли, делая «разделяй и властвуй» и записывая запросы, такие как тот, на который ссылается bluefeet, чтобы сузить его.
Техника использования DMV в этом запросе сэкономит вам некоторое время.
Кроме того, остерегайтесь таких утверждений, как
select cast(col as decimal(18,6)
where isnumeric(col)
Мало того, что isnumeric
не только неожиданно обрабатывает определенные значения, но и SQL Server может свободно определять порядок применения операций, так что запрос может закончитьсяприменяя приведение перед фильтрацией строк.Это может произойти, даже если фильтр находится внутри подзапроса или CTE.
Наконец, помните, что вы можете использовать предложение top x percent
в своем исследовании, чтобы помочь вам сузить строки, вызывающие проблемы.