SQL Server中ISNULL函数的截断问题

Swa*_*nil 2 sql sql-server isnull

最近我遇到了一个场景,ISNULL如果第一个字符串为null ,函数将返回截断的数据.

ISNULL(a, b);
Run Code Online (Sandbox Code Playgroud)

我发现a是5个字符,b是10个字符,但是当a为null时,它只返回5个字符b而不是全长.

这是一个已知的问题?

Pரத*_*ீப் 8

这是一种已知的行为

来自MSDN

如果不是NULL,则返回check_expression的值; 否则,如果replacement_value被隐式转换为check_expression的类型,则返回replacement_value(如果类型不同).如果replacement_value长于check_expression,则可以截断replacement_value.

使用COALESCE过度来到这个问题

SELECT COALESCE(a, b) From yourtable
Run Code Online (Sandbox Code Playgroud)

这是一个演示

CREATE TABLE #nulltest 
  ( 
     a CHAR(5), 
     b CHAR(10) 
  ) 

INSERT INTO #nulltest 
VALUES      ('12345','1234567890'), 
            (NULL,'1234567890')   

SELECT a,   
       b, 
       ISNULL(a, b)   AS Isnull_Result, 
       COALESCE(a, b) AS Coalesce_Result 
FROM   #nulltest   
Run Code Online (Sandbox Code Playgroud)

结果:

????????????????????????????????????????????????????????
?   a   ?     b      ? Isnull_Result ? Coalesce_Result ?
????????????????????????????????????????????????????????
? 12345 ? 1234567890 ?         12345 ?      12345      ?
? NULL  ? 1234567890 ?         12345 ?      1234567890 ?
????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)