По отношение на последващата ви мисъл.
SQL Server 2012 въвежда TRY_CONVERT
за тази нужда. Така че следната заявка ще върне NULL
а не грешка.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Няма гаранция дори при серийни планове, че WHERE
клаузата ще се случи преди SELECT
се оценява. Както е обяснено в тази публикация в блог
от SQL Server 2005 нататък това е по-вероятно да се случи, отколкото в предишните версии. Промени в поведението на функциите на Database Engine в SQL Сървър 2005
конкретно извиква това по следния начин.
Повече дискусии за това поведение има в друга добра публикация в блог от Крейг Фридман Конвертиране и аритметични грешки .
Във версии преди 2012 г. и TRY_CONVERT
трябва да обвиете CAST AS FLOAT
в CASE
изявление. напр.
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Това все още не е абсолютно гарантирано, за да предотврати получаването на грешки като ISNUMERIC
сам по себе си просто проверява дали стойността ще бъде прехвърлена към един от числовите типове данни, а не конкретно към плаващ Пример за въвеждане, което би било неуспешно, е '.'
CASE
е документиран като предимно късо съединение в книги онлайн (някои изключения се обсъждат тук
)
Можете също да намерите допълнителни дискусии/жалби за това в елемента за свързване SQL Server не трябва да предизвиква нелогични грешки и добро обяснение на подобен проблем от SQLKiwi