Jeśli chodzi o Twoje przemyślenia.
SQL Server 2012 wprowadza TRY_CONVERT
dla tej potrzeby. Zatem następujące zapytanie zwróci NULL
a nie błąd.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Nie ma gwarancji, nawet w przypadku planów szeregowych, że WHERE
klauzula nastąpi przed SELECT
jest oceniany. Jak wyjaśniono w tym poście na blogu
od SQL Server 2005 jest to bardziej prawdopodobne niż w poprzednich wersjach. Zmiany zachowania funkcji aparatu bazy danych w programie SQL Serwer 2005
konkretnie nazywa to w następujący sposób.
Więcej dyskusji na temat tego zachowania znajduje się w innym dobrym poście na blogu Craiga Freedmana Błędy konwersji i arytmetyczne .
W wersjach wcześniejszych niż 2012 i TRY_CONVERT
musisz zawinąć CAST AS FLOAT
w CASE
oświadczenie. np.
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
To nadal nie jest całkowicie gwarantowane, aby zapobiec otrzymywaniu błędów jako ISNUMERIC
sama po prostu sprawdza, czy wartość zostanie rzucona na jeden z numerycznych typów danych, a nie konkretnie na float Przykładem danych wejściowych, które nie powiodło się, jest '.'
CASE
jest udokumentowany w większości przypadków zwarcia w książkach online (omówiono tu pewne wyjątki
)
Dodatkowe dyskusje/skargi na ten temat można znaleźć w elemencie connect SQL Server nie powinien zgłaszać nielogicznych błędów i dobre wyjaśnienie podobnego problemu przez SQLKiwi