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

ISNULL在SQL server 2008中提供了错误的值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个场景来检查第一个变量是否为null,然后显示给另一个变量值,因为我使用的是ISNULL,但它给出了错误的值。我不知道下面给出的代码中是否有错误: DECLARE @str1 VARCHAR(5) = NULL, @str2 VARCHAR(10) = 'SQL Strings'; PRINT ISNULL(@str1, @str2); 但是它只打印sqls,这是因为类型由第一列决定,即使它是NULL。如果您这样做: DECLARE @str1 VARCHAR(10)

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

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

PRINT ISNULL(@str1, @str2);

但是它只打印
sqls

,这是因为类型由第一列决定,即使它是
NULL
。如果您这样做:

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

PRINT ISNULL(@str1, @str2);
然后你会得到预期的答案

文件说:

重置价值

如果check_表达式为NULL,则返回的表达式。替换值必须是可隐式转换为check\u expression类型的类型

换句话说,第二个值始终转换为第一种类型。需要注意的是,这与SQL Server更努力地确定类型的
coalesce()
不同。因此,
coalesce(@str1,@str2)
执行您期望的操作(请参阅)。

ISNULL()返回与check_表达式相同的数据类型(第一个参数)。由于只有5个字符,字符串被截断:

您需要改用COALESCE:

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

PRINT COALESCE(@str1, @str2);
PRINT ISNULL(@str1, @str2);