SQL Server 2014中的ISNULL()函数表达出乎意料


Declare @Var1 Varchar(5) = Null
Declare @Var2 Varchar(10) = 'ABCDEFGHIJ'
SELECT ISNULL(@Var1, @Var2) AS Result

我除了结果为' ABCDEFGHIJ',但结果是 'ABCDE'

这是功能的正常行为还是我缺少任何东西?

您已经使用了varchar(5),这就是为什么正在发生这种情况

在下面使用

 Declare @Var1 Varchar(50) = Null

这将给您预期的答案

您应该使用 coalesce函数,因为 Coalesce()函数返回其参数之间的第一个非编号值。

SELECT COALESCE(@Var1, @Var2) AS Result

或者您可以更改声明变量的大小。两者都会为您提供预期的输出。

要回答您的问题,是的,这是ISNULL的正常行为。它采用第一个表达式的类型。

参考https://msdn.microsoft.com/en-us/library/ms184325.aspx

如果check_expression的值不为null,则将返回; 否则,替换为隐性后返回 如果类型不同,则转换为check_expression的类型。 如果替换_value比 check_expression。

作为替代方案,您应该使用COALESCE

使用 cocece 函数:不确定为什么会这样返回输出,但是假设在检查ISNULL(p1,p2)时,它将仅考虑第一个参数的大小。

SELECT COALESCE(@Var1, @Var2) AS Result

这是因为您的源变量长度为5,因此已将另一部分截断

Declare @Var1 Varchar(10) = Null
Declare @Var2 Varchar(10) = 'ABCDEFGHIJ'
SELECT ISNULL(@Var1, @Var2) AS Result

ISNULL(@Var1, @Var2)语句如果@var1为null,则将@Var2的值复制为@var1,而@var1的长度为5,这就是为什么它仅显示前五个字符。

最新更新