Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

błąd konwersji varchar na float

Oznacza to, że masz co najmniej jeden wiersz w tabeli, którego nie można rzutować na float . Robienie CASE jest bezpieczne, ale łączenie CTE i dodanie klauzuli WHERE jest częstym błędem programistów piszących T-SQL:że kolejność deklaracji implikuje kolejność wykonywania . Programiści są przyzwyczajeni do imperatywnego stylu proceduralnego języków takich jak C i nie rozumieją deklaratywnej natury SQL opartej na zbiorach. Pisałem już wcześniej o tym problemie i podałem przykłady, kiedy błąd powoduje błędy:

Po opublikowaniu pełnego kodu możemy zobaczyć, gdzie dokładnie popełniłeś błąd w swoim przypadku i założyliśmy określoną kolejność wykonywania.

po aktualizacji

OK, więc muszę administrować, że w Twoim przypadku kod jest poprawny w kolejności wykonania, result kolumna nie może być rzutowana bez uprzedniej oceny CASE . Gdyby przypadek był w klauzuli WHERE, sprawy potoczyłyby się inaczej.

Twój problem jest inny:ISNUMERIC . Ta funkcja bardzo dobrze rozumie, co NUMERIC oznacza i ugryzł już wielu programistów. Mianowicie przyjmuje wartości, które CAST i CONVERT odrzucą. Jak te zawierające przecinek:

declare @n varchar(8000) = '1,000';
select isnumeric(@n);
select cast(@n as float);
select case when isnumeric(@n)=1 then cast(@n as float) else null end;

Masz więc wartości, które przekazują ISNUMERIC test, ale nie można przekonwertować. Tylko głowa do góry, im bardziej będziesz się zagłębiać w to podejście, tym bardziej zamknięte drzwi znajdziesz. To po prostu nie jest bezpieczny sposób na obsadę, której potrzebujesz po stronie serwera. W idealnym przypadku napraw model danych (ustaw pole jako zmiennoprzecinkowe, jeśli przechowuje zmiennoprzecinkowe). Krótko mówiąc, triaguj dane i usuń wszystkie wartości, które nie są właściwymi wartościami zmiennoprzecinkowymi, i napraw front-end/aplikację, aby nie wprowadzały już nowych, a następnie dodaj ograniczenie, które wywoła błąd, jeśli pojawią się nowe złe wartości. Nie będziesz w stanie rozwiązać tego za pomocą zapytania, ta droga jest zaśmiecona ciałami.

W następnej wersji SQL Server będziesz mieć nową funkcję, TRY_CONVERT , to rozwiąże Twój problem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj rekordy w tabeli z CTE

  2. W tabeli odniesienia nie ma kluczy podstawowych ani kandydujących, które pasują do listy kolumn odniesienia w kluczu obcym

  3. Jak bezpośrednio wykonać zapytanie SQL w C#?

  4. SQL Server 2008 — Jak zwrócić typ tabeli zdefiniowanej przez użytkownika z funkcji o wartościach przechowywanych w tabeli?

  5. Limit rozmiaru VARCHAR w arkuszach kalkulacyjnych Excel