我有以下代码,我使用ISnumeric函数来检查表达式的有效性,以便在sql中进行数学运算。
但如果我在这里使用ISnumeric函数,它会为下面列出的两个条件返回0。我需要一些函数或方法来识别有效的数学表达式。
这个有替代品吗?
Begin
DECLARE @rcnt as VARCHAR(100)
DECLARE @ncnt as VARCHAR(100)
--Condition1
SET @rcnt = '(5918800.000 / 4963400.000) * (Slaughter(1023))'
--Condition2
SET @ncnt = '(5997200.000 / 5059900.000) * (400000.000)'
Select ISNUMERIC(@rcnt) as validittcheck
Select ISNUMERIC(@ncnt ) as validittcheck
END
答案 0 :(得分:1)
ISNUMERIC()检查变量是否为有效的数值数据类型,而不是对字符串表达式的求值结果是有效数值。第一个'('被评估后,您的值就变为非数字。
我知道获得所需结果的唯一方法是使用动态sql。这是一个例子,请注意我把try catch放在那里因为你的Slaughter()函数不存在而且引发了异常,所以返回零,因为它不是一个数字:
DECLARE @rcnt as NVARCHAR(100)
DECLARE @ncnt as NVARCHAR(100)
--Condition1
SET @rcnt = 'SELECT @Result=ISNUMERIC( (5918800.000 / 4963400.000) * (Slaughter(1023)) )'
--Condition2
SET @ncnt = 'SELECT @Result=ISNUMERIC( (5997200.000 / 5059900.000) * (400000.000) )'
DECLARE @ResultValue1 INT=0
DECLARE @ResultValue2 INT=0
DECLARE @ResultParam NVARCHAR(100)= '@Result int OUTPUT'
BEGIN TRY
EXEC sp_executesql @rcnt, @ResultParam, @Result=@ResultValue1 OUTPUT
END TRY
BEGIN CATCH
END CATCH
BEGIN TRY
EXEC sp_executesql @ncnt, @ResultParam, @Result=@ResultValue2 OUTPUT
END TRY
BEGIN CATCH
END CATCH
SELECT @ResultValue1
SELECT @ResultValue2