当前位置:  开发笔记 > 数据库 > 正文

SQL Server上的高效ISNUMERIC()替换?

如何解决《SQLServer上的高效ISNUMERIC()替换?》经验,为你挑选了3个好方法。

所以我只花了5个小时来解决一个问题,原因不仅是旧的不可靠, ISNUMERIC而且看起来我的问题只出现在UDF中ISNUMERIC声明WITH SCHEMABINDING并在存储过程中被调用(我有很多要将其提炼成测试用例的工作,但我的第一个需要是用可靠的东西替换它.

关于良好,有效的替代品的任何建议ISNUMERIC().显然,真正需要的是变化int,money等等,但什么是使用(最好是在T-SQL,因为在这个项目上,我仅限于SQL Server的人,因为这是一个高容量的SQL服务器到SQL Server数据处理任务)?



1> Dave Markle..:

如果您在评论中运行SQL Server 2012作为培根比特提及,则可以使用T-SQL函数TRY_CAST()或TRY_CONVERT():

SELECT CASE WHEN TRY_CAST('foo' AS INT) IS NULL THEN 0 ELSE 1 END

SELECT CASE WHEN TRY_CAST(1 AS INT) IS NULL THEN 0 ELSE 1 END

如果您使用的是SQL 2008 R2或更早版本,则必须使用.NET CLR函数,并包装System.Decimal.TryParse().


而且速度也慢一些.

2> RoadWarrior..:

根据情况和验证的性能特征,我有时会使用LIKE表达式的变体.例如:

NOT LIKE '%[^0-9]%'

请注意,此具体示例相当幼稚.它不保证该值对于转换为特定数据类型有效.如果需要,它也不允许+/-符号或小数点.


IsNumeric也不能很好地扩展,也不会编写自己的UDF.这本质上是一个相对缓慢的检查.

3> Sam Schutte..:

另一种选择可能是用C等语言编写扩展存储过程,将其转换为DLL并使其可供SQL Server使用.

我不认为它需要太多的代码行,并且它可能比在.NET中编写托管存储过程更快,因为你不会因加载CLR而引起额外的窃听.

这里有一些信息:http: //msdn.microsoft.com/en-us/library/ms175200.aspx

这里有一些可能适合您的C++代码:

using namespace std;

int checkNumber() {
  int number = 0;
  cin >> number;
  cin.ignore(numeric_limits::max(), '\n');

  if (!cin || cin.gcount() != 1)
    cout << "Not a number.";
  else
    cout << "Your entered: " << number;
  return 0;
}

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有