Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL server中是否有检查数学表达式并返回有效数字的函数?_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

在SQL server中是否有检查数学表达式并返回有效数字的函数?

在SQL server中是否有检查数学表达式并返回有效数字的函数?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有下面的代码,其中我使用ISnumeric函数检查表达式的有效性,以在sql中进行计算 但是如果我在这里使用ISnumeric函数,它会在下面列出的两个条件下返回0。我需要一些函数或方法来识别有效的数学表达式 有没有别的选择 Begin DECLARE @rcnt as VARCHAR(100) DECLARE @ncnt as VARCHAR(100) --Condition1 SET @rcnt = '(5918800.000 / 4963400.000) * (Slaughter(102

我有下面的代码,其中我使用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
ISNUMERIC()检查变量是否为有效的数值数据类型,而不是字符串表达式的计算结果是否为有效的数值。计算第一个“(”后,您的值就变为非数字

我知道获得所需结果的唯一方法是使用动态sql。下面是一个示例,请注意,我在其中添加了try catch,因为您的slaught()函数不存在,并且引发了异常,因此返回零,因为它不是一个数字:

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

不,没有任何内置的东西可以做这样的事情。
select isNumeric(exec('select'+@ncnt))由于Validittcheck
可能会起作用……但我认为您需要将其包装在一个try-catch中,因为除非这是您的代码的函数,否则屠宰将失败。本质上,如果它返回数字,我们会尝试它,您知道它的有效性,如果它返回错误,您知道它的无效性。添加了一个替代方案。您可能应该添加某种健康警告,因为这是可能的如果值的源不可信,则使用SQL注入方法。是的,当然是。他的代码位于BES end块中,因此我假设它包含在一个存储过程中,在该存储过程中,值将作为经过消毒的参数发送。无论如何,我希望如此:)此外,我将指出空的try catch是无用的,是一种可怕的做法。我只是想让他的代码执行。我建议您不要使用这种查询,如果您可以将值作为参数发送,那么它会更干净、更高效、更安全……总之是一种更好的方法。