Med hensyn til din eftertanke.
SQL Server 2012 introducerer TRY_CONVERT
til dette behov. Så den følgende forespørgsel ville returnere NULL
snarere end en fejl.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Der er ingen garanti, selv med serielle planer, at WHERE
klausul vil ske før SELECT
er vurderet. Som forklaret i dette blogindlæg
fra SQL Server 2005 og fremefter er det mere sandsynligt, at dette sker end i tidligere versioner. adfærdsændringer til databasemotorfunktioner i SQL Server 2005
kalder dette specifikt ud som følger.
Mere diskussion om denne adfærd er i et andet godt blogindlæg af Craig Freedman Konverterings- og aritmetiske fejl .
På versioner før 2012 og TRY_CONVERT
du skal pakke CAST AS FLOAT
i en CASE
udmelding. f.eks.
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Dette er stadig ikke helt garanteret for at forhindre, at du får fejl som ISNUMERIC
selv tjekker bare, at værdien ville kaste til en af de numeriske datatyper i stedet for specifikt at flyde Et eksempel på et input, der ville mislykkes, er '.'
CASE
er dokumenteret for det meste kortslutning i bøger online (nogle undtagelser er diskuteret her
)
Du kan også finde yderligere diskussion/klager om dette i forbindelsespunktet SQL Server bør ikke give ulogiske fejl og en god forklaring på et lignende problem af SQLKiwi