首页 > 解决方案 > 如果在 SQL Server 和 SQL LocalDB 上强制转换 bigint,则会出现不同的行为

问题描述

我在 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-servertsqllocaldb

解决方案


这里的问题是您正在尝试重新发明轮子。每个受支持的 SQL Server 版本都具有在无法转换值时TRY_CONVERT返回的函数。NULL

ISNUMERIC也是非常有缺陷的。然而,像ISNUMERIC('1.23')and ISNUMERIC('7e2')return这样的事情都失败了。同样返回,但是,返回,而不是错误。1CONVERT(int, '1.23')CONVERT(decimal(10,2),'7e2')ISNUMERIC('')0CONVERT(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应该避免的文章:


推荐阅读