所以我只花了5个小时来解决一个问题,原因不仅是旧的不可靠, ISNUMERIC
而且看起来我的问题只出现在UDF中ISNUMERIC
声明WITH SCHEMABINDING
并在存储过程中被调用(我有很多要将其提炼成测试用例的工作,但我的第一个需要是用可靠的东西替换它.
关于良好,有效的替代品的任何建议ISNUMERIC()
.显然,真正需要的是变化int
,money
等等,但什么是使用(最好是在T-SQL,因为在这个项目上,我仅限于SQL Server的人,因为这是一个高容量的SQL服务器到SQL Server数据处理任务)?
如果您在评论中运行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().
根据情况和验证的性能特征,我有时会使用LIKE表达式的变体.例如:
NOT LIKE '%[^0-9]%'
请注意,此具体示例相当幼稚.它不保证该值对于转换为特定数据类型有效.如果需要,它也不允许+/-符号或小数点.
另一种选择可能是用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; }