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
,这就是为什么它仅显示前五个字符。