2017-03-03 31 views
0
Declare @Var1 Varchar(5) = Null 
Declare @Var2 Varchar(10) = 'ABCDEFGHIJ' 

SELECT ISNULL(@Var1, @Var2) AS Result 

我除了结果是'ABCDEFGHIJ',但结果是'ABCDE'SQL Server 2014中的ISNULL()函数表现异常

这是该函数的正常行为还是我错过了什么?

+0

http://stackoverflow.com/documentation/sql-server/5044/nulls/25800/coalesce#t=201703030715583559345 – Yahfoufi

回答

1

使用COALESCE功能:不知道为什么ISNULL返回类似这样的输出,但假设在检查ISNULL(p1,p2)将只考虑第一个参数的大小。

SELECT COALESCE(@Var1, @Var2) AS Result 
0

那是因为你的源变量的长度是5,因此它已被截断,另一部分

Declare @Var1 Varchar(10) = Null 
Declare @Var2 Varchar(10) = 'ABCDEFGHIJ' 

SELECT ISNULL(@Var1, @Var2) AS Result 
3

您已经使用VARCHAR(5)这就是为什么发生这种情况之下

使用

Declare @Var1 Varchar(50) = Null 

这会给你预期的答案

3

您应该使用​​3210函数,因为Coalesce()函数返回其参数中的第一个非空值。

SELECT COALESCE(@Var1, @Var2) AS Result 

或者您可以更改所声明变量的大小。两者都会给你预期的产出。

3

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

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

如果不是,则返回NULL check_expression的价值; 否则,在隐式地将 转换为check_expression类型后,如果类型不同,则返回replacement_value。 如果replacement_value长于 check_expression,则可以截断replacement_value。

作为替代,你应该宁愿使用COALESCE

0

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