一个函数解决SQLServer中bigint 转 int带符号时报错问题

问题介绍

在SQL Server中,将bigint转为int带符号时,由于数据类型不匹配,有可能会导致转换失败的问题。

例如,以下SQL语句:

SELECT CAST(9223372036854775807 AS BIGINT) AS bigint_value, CAST(9223372036854775807 AS BIGINT) AS failed_int_value;

其结果如下:

bigint_value failed_int_value
9223372036854775807 Conversion failed when converting the bigint value '9223372036854775807' to data type int.

可以看到,将bigint转为int带符号时,会报错。

解决方案

方法一:使用CASE WHEN语句

一种解决方法是使用CASE WHEN语句进行条件判断,在转换之前检查数据是否超出了int类型的取值范围。如果超出了取值范围,则将其转换为0,否则将其正常转换。

以下是使用CASE WHEN语句解决问题的SQL语句示例:

SELECT 

CAST(CASE WHEN 9223372036854775807 >= -2147483648 AND 9223372036854775807 <= 2147483647

THEN 9223372036854775807 ELSE 0 END AS INT) AS int_value;

其结果如下:

int_value
0

可以看到,已经成功将bigint转换为了int类型。

方法二:使用TRY_CONVERT函数

另一种解决方法是使用SQL Server自带的TRY_CONVERT函数。

以下是使用TRY_CONVERT函数解决问题的SQL语句示例:

SELECT TRY_CONVERT(INT, 9223372036854775807) AS int_value;

其结果如下:

int_value
NULL

可以看到,使用TRY_CONVERT函数仍然无法将bigint成功转换为int类型。

总结

在SQL Server中,将bigint转为int带符号时,由于数据类型不匹配,有可能会导致转换失败的问题。解决该问题的方法有很多种,比如使用CASE WHEN语句进行条件判断,在转换之前检查数据是否超出了int类型的取值范围;或者使用SQL Server自带的TRY_CONVERT函数。其中,推荐使用CASE WHEN语句进行解决。

数据库标签