IsNumeric - это проблемный дочерний объект - в SQL 2012 и более поздних версиях TRY_CAST и TRY_CONVERT
Если вы работаете в более ранней версии, вы можете написать функцию, которая преобразуется вдесятичный (или NULL, если он не будет преобразован).При этом используются функции преобразования XML, которые не выдают ошибок, когда число не подходит;)
-- Create function to convert a varchar to a decimal (returns null if it fails)
IF EXISTS( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID( N'[dbo].[ToDecimal]' ) AND type IN( N'FN',N'IF',N'TF',N'FS',N'FT' ))
DROP FUNCTION [dbo].[ToDecimal];
GO
CREATE FUNCTION ToDecimal
(
@Value VARCHAR(MAX)
)
RETURNS DECIMAL(18,8)
AS
BEGIN
-- Uses XML/XPath to convert @Value to Decimal because it returns NULL it doesn't cast correctly
DECLARE @ValueAsXml XML
SELECT @ValueAsXml = Col FROM (SELECT (SELECT @Value as Value FOR XMl RAW, ELEMENTS) AS Col) AS test
DECLARE @Result DECIMAL(38,10)
-- XML/XPath will return NULL if the VARCHAR can't be converted to a DECIMAL(38,10)
SET @Result = @ValueAsXml.value('(/row/Value)[1] cast as xs:decimal?', 'DECIMAL(38,10)')
RETURN CASE -- Check if the number is within the range for a DECIMAL(18,8)
WHEN @Result >= -999999999999999999.99999999 AND @Result <= 999999999999999999.99999999
THEN CONVERT(DECIMAL(18,8),@Result)
ELSE
NULL
END
END
Затем просто измените запрос на:
select dbo.ToDecimal(Reserve) from MyReserves