sql-server - 如果在 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 Server 版本都具有在无法转换值时TRY_CONVERT
返回的函数。NULL
ISNUMERIC
也是非常有缺陷的。然而,像ISNUMERIC('1.23')
and ISNUMERIC('7e2')
return这样的事情都失败了。同样返回,但是,返回,而不是错误。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
应该避免的文章:
推荐阅读
- css - 如何在悬停时设置 Vuetify v-data-table 行的背景颜色?
- c# - 如何设计这个 ListViewItem
- mule - Mulesoft 与 Salesforce 流 API 使用 CDC
- c# - 如何增量加载列表视图的先前项目
- c# - Unity MobAd 奖励视频无法正常工作
- python - 与 ImageDataGenerator 一起使用时,Keras Resnet50 preprocess_input 会出现灰度图像错误
- git - 在 Git 存储库之间共享 Nuget.config
- c# - 遍历 JSON?
- java - Dagger2:如何在不注入合成器类的情况下注入字段?
- vue.js - vuetify 表自定义排序“TypeError:无法读取未定义的属性'过滤器'”