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

Cad*_*oux 17 sql-server user-defined-functions isnumeric

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

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

Dav*_*kle 22

如果您在评论中运行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
Run Code Online (Sandbox Code Playgroud)

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

  • 而且速度也慢一些. (2认同)

Roa*_*ior 16

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

NOT LIKE '%[^0-9]%'
Run Code Online (Sandbox Code Playgroud)

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

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

Sam*_*tte 6

另一种选择可能是用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<int>::max(), '\n');

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