Ohledně vaší následné myšlenky.
SQL Server 2012 zavádí TRY_CONVERT
pro tuto potřebu. Následující dotaz by tedy vrátil NULL
spíše než chyba.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Ani u sériových plánů není zaručeno, že WHERE
klauzule se stane před SELECT
se hodnotí. Jak je vysvětleno v tomto příspěvku na blogu
počínaje SQL Serverem 2005 je to pravděpodobnější než v předchozích verzích. Změny chování funkcí databázového stroje v SQL Server 2005
konkrétně to nazývá následovně.
Další diskuse o tomto chování je v jiném dobrém blogovém příspěvku od Craiga Freedmana Převod a aritmetické chyby .
Ve verzích před rokem 2012 a TRY_CONVERT
musíte zabalit CAST AS FLOAT
v CASE
tvrzení. např.
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Stále není zcela zaručeno, že zabráníte chybám jako ISNUMERIC
sám pouze zkontroluje, zda by hodnota byla přetypována na jeden z číselných datových typů, nikoli konkrétně na float Příkladem vstupu, který by selhal, je '.'
CASE
je zdokumentován většinou zkrat v knihách online (některé výjimky jsou popsány zde
)
Další diskuzi/stížnosti k tomuto můžete také najít v položce připojení SQL Server by neměl vyvolávat nelogické chyby a dobré vysvětlení podobného problému od SQLKiwi