ISNULL在SQL Server 2008中提供了错误的值

时间:2015-01-07 11:57:40

标签: sql sql-server sql-server-2008

我有一个方案来检查第一个变量是否为null然后显示另一个变量值,因为我使用的是ISNULL但是它给出了错误的值。我不知道我的代码是错的下面:

DECLARE @str1 VARCHAR(5) = NULL,
        @str2 VARCHAR(10) = 'SQL Strings';

PRINT ISNULL(@str1, @str2);

但它只打印SQL S

2 个答案:

答案 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);