我有一个方案来检查第一个变量是否为null然后显示另一个变量值,因为我使用的是ISNULL
但是它给出了错误的值。我不知道我的代码是错的下面:
DECLARE @str1 VARCHAR(5) = NULL,
@str2 VARCHAR(10) = 'SQL Strings';
PRINT ISNULL(@str1, @str2);
但它只打印SQL S
。
答案 0 :(得分:9)
这是因为类型由第一列决定,即使它是NULL
。如果你这样做:
DECLARE @str1 VARCHAR(10) = NULL,
@str2 VARCHAR(10) = 'SQL Strings';
PRINT ISNULL(@str1, @str2);
然后你会得到预期的答案。
文档说:
Replacement_value
如果check_expression为NULL,则返回表达式。 replacement_value必须是可以隐式转换为check_expresssion类型的类型。
换句话说,第二个值总是转换为第一个类型。请注意,这与coalesce()
不同,其中SQL Server更难以确定类型。因此,coalesce(@str1, @str2)
符合您的预期(参见here)。
答案 1 :(得分:2)
ISNULL()返回与check_expression相同的数据类型(第1个争论)。由于字符串只有5个字符被截断:
您需要改为使用COALESCE:
DECLARE @str1 VARCHAR(5) = NULL,
@str2 VARCHAR(10) = 'SQL Strings';
PRINT COALESCE(@str1, @str2);
PRINT ISNULL(@str1, @str2);