Angående din eftertanke.
SQL Server 2012 introducerar TRY_CONVERT
för detta behov. Så följande fråga skulle returnera NULL
snarare än ett fel.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Det finns ingen garanti även med serieplaner att WHERE
sats kommer att ske före SELECT
utvärderas. Som förklarat i detta blogginlägg
från SQL Server 2005 och framåt är det mer sannolikt att detta händer än i tidigare versioner. beteendeändringar av databasmotorfunktioner i SQL Server 2005
uttrycker detta specifikt enligt följande.
Mer diskussion om detta beteende finns i ett annat bra blogginlägg av Craig Freedman Konverterings- och aritmetiska fel .
På versioner före 2012 och TRY_CONVERT
du måste slå in CAST AS FLOAT
i ett CASE
påstående. t.ex.
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Detta är fortfarande inte helt garanterat för att förhindra att du får felmeddelanden som ISNUMERIC
själv kontrollerar bara att värdet skulle kastas till en av de numeriska datatyperna snarare än specifikt att flyta Ett exempel på en indata som skulle misslyckas är '.'
CASE
är dokumenterat att det mestadels kortsluter i böcker online (några undantag diskuteras här
)
Du kan också hitta ytterligare diskussioner/klagomål om detta i anslutningsobjektet SQL Server bör inte ge upphov till ologiska fel och en bra förklaring av ett liknande problem av SQLKiwi