我在 SQL Server 和 LocalDB 上有以下功能:
CREATE FUNCTION [dbo].[ConvertToLong]
(
@Value Varchar(200)
)
RETURNS Bigint
AS
BEGIN
If ISNUMERIC(@Value)<>1
Return 0
Else
Return Cast(@Value as bigint)
Return 0
END
像这样调用这个函数时:
SELECT dbo.[ConvertToLong]('13668433347')
我收到不同的结果:
SQL服务器:
13668433347
本地数据库:
Arithmetic overflow error converting expression to data type int.
您知道 LocalDB 的问题是什么以及如何修复它吗?
这里的问题是你试图重新发明轮子。每个受支持的 SQL Server 版本都有函数
TRY_CONVERT
,如果无法转换值,则返回 NULL
。
ISNUMERIC
也很有缺陷。像 ISNUMERIC('1.23')
和 ISNUMERIC('7e2')
这样的东西会返回 1
,但是 CONVERT(int, '1.23')
和 CONVERT(decimal(10,2),'7e2')
都会失败。另外 ISNUMERIC('')
返回 0
,但是,CONVERT(tinyint,'')
返回 0
,而不是错误。
因此,答案是使用内置函数,
TRY_CONVERT
(或TRY_CAST
):
SELECT TRY_CONVERT(bigint,'13668433347');
如果您想在发生转换错误时返回
0
,您可以使用 ISNULL
,如果您想保留 NULL
值,则可以使用 CASE
表达式。所以类似:
SELECT CASE WHEN YourColumn IS NOT NULL THEN ISNULL(TRY_CONVERT(bigint,YourColumn),0) END;
有很多文章解释了为什么也应该避免
ISNUMERIC
: