在 SQL Server 和 SQL LocalDB 上强制转换 bigint 时的不同行为

问题描述 投票:0回答:1

我在 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 t-sql localdb
1个回答
-1
投票

这里的问题是你试图重新发明轮子。每个受支持的 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

© www.soinside.com 2019 - 2024. All rights reserved.