SQL Server - ISNULL / NULLIF的意外行为

时间:2018-02-12 17:12:33

标签: sql-server isnull

尝试了解SQL Server中出现以下行为的原因。

以下表达式在我的服务器上返回'*': Select IsNull(NullIF(RTrim(NULL), ' '), '**')

不应该返回'**'吗?

如果我使用以下任何一种语句,它会正确返回'**'。

  1. sql_variant变量用于RTrim(NULL)
  2. declare @a sql_variant = RTRIM(NULL) Select IsNull(NullIF(@a, ' '), '**')

    1. 使用char(2)变量
    2. declare @a char(2) Set @a = NULL Select IsNull(NullIF(RTrim(@a), ' '), '**')

      SQL版本:SQL Server 2008 SP3 ANSI设置:默认SSMS设置。

2 个答案:

答案 0 :(得分:2)

原因是您的 NULL 没有初始数据类型,因此,当SQL Server将其转换为varchar时,它会有效地将其转换为varchar(1) }。因此,返回的值仅为'*'

要获得预期的行为,您需要让SQL Server知道 NULL 的数据类型是什么。例如,通过声明变量(如您所做)或使用CASTCONVERT

DECLARE @String varchar(2) = NULL;

SELECT ISNULL(NULLIF(RTRIM(@String), '  '), '**');
SELECT ISNULL(NULLIF(RTRIM(CONVERT(varchar(2),NULL)), '  '), '**');

答案 1 :(得分:1)

因为查询只返回第一个字符,因为参数null没有初始数据类型。尝试:

Select IsNull(NullIF(RTrim(cast(NULL as varchar(max))), '  '), '**')
Select IsNull(NullIF(RTrim(cast(NULL as varchar(max))), '  '), '*****')