尝试了解SQL Server中出现以下行为的原因。
以下表达式在我的服务器上返回'*':
Select IsNull(NullIF(RTrim(NULL), ' '), '**')
不应该返回'**'吗?
如果我使用以下任何一种语句,它会正确返回'**'。
sql_variant
变量用于RTrim(NULL)
declare @a sql_variant = RTRIM(NULL)
Select IsNull(NullIF(@a, ' '), '**')
char(2)
变量 declare @a char(2)
Set @a = NULL
Select IsNull(NullIF(RTrim(@a), ' '), '**')
SQL版本:SQL Server 2008 SP3 ANSI设置:默认SSMS设置。
答案 0 :(得分:2)
原因是您的 NULL
没有初始数据类型,因此,当SQL Server将其转换为varchar
时,它会有效地将其转换为varchar(1)
}。因此,返回的值仅为'*'
。
要获得预期的行为,您需要让SQL Server知道 NULL
的数据类型是什么。例如,通过声明变量(如您所做)或使用CAST
或CONVERT
:
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))), ' '), '*****')