sql >> Databáze >  >> RDS >> Sqlserver

chyba při převodu varchar na float

Znamená to, že v tabulce máte alespoň jeden řádek, který nelze přetypovat na float . Provedení CASE je bezpečné, ale kombinace CTE a přidání klauzule WHERE spadá do běžného omylu programátorů při psaní T-SQL:že pořadí deklarace implikuje pořadí provádění . Programátoři jsou zvyklí na imperativní procedurální styl jazyků podobných C a nedokážou pochopit povahu SQL založenou na deklarativní množině. O tomto problému jsem již psal a uvedl příklady, kdy omyl způsobuje chyby:

Jakmile odešlete svůj úplný kód, uvidíme, kde přesně jste ve vašem případě udělali chybu a předpokládali určité pořadí provedení.

po aktualizaci

OK, takže musím admina, že ve vašem případě je kód správný v pořadí provádění, result sloupec nelze promítnout bez předchozího vyhodnocení CASE . Kdyby byl CASE v klauzuli WHERE, věci by byly jiné.

Váš problém je jiný:ISNUMERIC . Tato funkce velmi dobře rozumí tomu, co NUMERIC znamená a již dříve nakousl mnoho vývojářů. Konkrétně přijímá hodnoty, které CAST a CONVERT odmítnou. Jako ty, které obsahují čárku:

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;

Takže máte hodnoty, které předají ISNUMERIC test, ale nezdaří se převést. Jen pozor, čím více se budete do tohoto přístupu vrtat, tím více zavřených dveří najdete. Není to bezpečný způsob, jak provést obsazení, které potřebujete na straně serveru. V ideálním případě opravte datový model (udělejte z pole plovoucí, pokud ukládá float). Krátce na to, roztřiďte data a odstraňte všechny hodnoty, které nejsou správné float, a opravte front-end/aplikaci tak, aby již nezaváděla nové, a poté přidejte omezení, které spustí chybu, pokud se objeví nové špatné hodnoty. V dotazu to nevyřešíte, ta cesta je posetá těly.

S další verzí SQL Serveru budete mít novou funkci, TRY_CONVERT , to by váš problém vyřešilo.



  1. Jak resetovat číslo/sloupec automatického přírůstku v tabulce MySql

  2. PostgreSQL:Udělte veškerá oprávnění uživateli v databázi PostgreSQL

  3. Mountain Lion Postgres se nemohl připojit

  4. vypočítat většinu uživatelů, kteří kdy byli online s MySQL