Wat betreft uw gedachte.
SQL Server 2012 introduceert wel TRY_CONVERT
voor deze behoefte. Dus de volgende query zou NULL
opleveren in plaats van een fout.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Zelfs met seriële plannen is er geen garantie dat de WHERE
clausule zal gebeuren voor de SELECT
wordt geëvalueerd. Zoals uitgelegd in deze blogpost
vanaf SQL Server 2005 is dit waarschijnlijker dan in eerdere versies. De gedragswijzigingen in Database Engine-functies in SQL Server 2005
noemt dit specifiek als volgt.
Meer discussie over dit gedrag staat in een andere goede blogpost van Craig Freedman Conversie- en rekenfouten .
Op versies vóór 2012 en TRY_CONVERT
je moet de CAST AS FLOAT
. inpakken in een CASE
uitspraak. bijv.
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Dit is nog steeds niet absoluut gegarandeerd om te voorkomen dat u fouten krijgt als ISNUMERIC
zelf controleert alleen of de waarde naar een van de numerieke datatypes wordt gecast in plaats van specifiek te zweven Een voorbeeld van een invoer die zou mislukken is '.'
CASE
is gedocumenteerd voor voornamelijk kortsluiting in boeken online (enkele uitzonderingen worden hier besproken
)
U kunt ook aanvullende discussies/klachten hierover vinden in het connect item SQL Server mag geen onlogische fouten veroorzaken en een goede uitleg van een soortgelijk probleem door SQLKiwi