ta będzie domyślnie nie-numeryczne 0 i nie będzie wymagać innego oświadczenie:
SELECT CASE
WHEN ISNUMERIC(myvarcharcolumn)=1 THEN
CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.'))
ELSE 0 END AS myfloatcolumn
replace() Wywołanie funkcji służy do zmiany okresów przecinków. Przecinki są używane w niektórych kulturach jako separator dziesiętny (np. "1,25" zamiast "1,25"), ale jeśli twój serwer nie jest skonfigurowany z jedną z nich jako domyślną kulturą, ISNUMERIC() zwróci 1, ale CONVERT () rzuci błąd. Ta ma wartość, co oznacza, że ciągi nie powinny używać przecinków jako separatorów tysięcy, ale w większości przypadków przecinek z kropką dziesiętną jest bardziej prawdopodobnym miejscem dziesiętnym.
Wywołanie LTRIM (RTRIM()) jest spowodowane tym, że funkcja ISNUMERIC() zwróci 1 dla ciągu znaków ze spacjami wiodącymi lub końcowymi, ale funkcja CONVERT() nie może ich obsłużyć. Musisz więc przyciąć struny.
Jedyny pozostały potencjalny problem to to, że ISNUMERIC() zwróci 1, jeśli liczba może być reprezentowana jako int, currency, decimal lub float, ale konwertujesz tylko do float. Realistycznie, float może przechowywać prawie wszystko, co na niego rzucasz, ale jeśli próbujesz przekonwertować na int, ISNUMERIC() zwróci 1 dla wartości takiej jak "2.5", ale CONVERT (int, "2.5") nadal rzucać błąd.
TRY CATCH nie pasuje do mojego rozwiązania, ponieważ jestem ograniczony i nie mogę dodawać dodatkowych instrukcji. Rozważę dodanie dodatkowej funkcji, która bezpiecznie wykona rzucanie.Coś w stylu "myconvert (typ, dane, wartość domyślna)", zastanawiam się, czy istnieje inny sposób, który uwolniłby mnie od dodania funkcji niestandardowej do bazy danych. – AndrewG
+1 dla TRY..CATCH - to naprawdę droga! –
"SELECT CASE" w poniższej odpowiedzi jest lepsze i bardziej elastyczne niż SPRÓBUJ ... POŁOWU. – TamusJRoyce