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.