I know the newer versions have a try parse method similar to c# but unfortunately I'm on 2005. I know the knock on the built-in function to validate numbers is that it technically doesn't and many recommend creating one.
Is it acceptable and efficient to just use a try catch block with the catch block being considered false? ie
TRY
CONVERT(decimal(19,2),@value)
END TRY
GO
BEGIN CATCH
--false. Log error (or whatever you want to do)
END CATCH;
GO