5

在尝试使用 MSSQL 时,我遇到了一些我无法解释的行为。

我正在查看将 NULL 值添加到 varchar 时会发生什么,以及当我执行以下查询时:

SELECT
   ISNULL(NULL + ' ', 'test')

我得到结果'te'。同样,如果我将单词 test 更改为任何其他单词,我只会得到前两个字母。如果我增加 + ' ' 中的空格数,我的结果中会出现额外的字母(所以 NULL + '[两个空格]' 给我 'tes')。有什么想法吗?

如果我声明一个变量并将其设置为 NULL 例如

DECLARE @testnull AS varchar(32)

SET @testnull = NULL

SELECT
ISNULL(@testnull + ' ', 'test')

然后我得到结果“测试”(如我所料)。

4

1 回答 1

7

使用COALESCE. ISNULL采用第一个NON-NULL 数据类型,在这种情况下,因为它没有被声明,所以你得到 a VARCHAR(1)NULL然后VARCHAR(2)当你添加空间时它变成 a (这仍然是NULL在评估时,但 SQL Server 在此之前做了一个假设步)。在某些情况下,varchar没有长度的默认值是 1,而在其他情况下,它是 30。我会让你猜猜这里使用的是哪一个。

SELECT
 ISNULL(NULL + ' ', 'test'), COALESCE(NULL + ' ', 'test');

结果:

----  ----
te    test

您可以通过以下方式明确看到这一点:

SELECT
   x = ISNULL(NULL + ' ', 'test')
   INTO #a1;

SELECT
   x = COALESCE(NULL + ' ', 'test')
   INTO #a2;

SELECT LEFT(t.name, 3), TYPE_NAME(c.user_type_id), max_length
FROM tempdb.sys.columns AS c
  INNER JOIN tempdb.sys.tables AS t
  ON c.[object_id] = t.[object_id]
  WHERE t.name LIKE '#a[1-2]%';

结果:

---  -------  ----
#a1  varchar     2
#a2  varchar     4

在几乎所有情况下,我更COALESCE喜欢ISNULL. 我在此提示中解释了原因(以及存在异常的位置):

于 2013-03-13T14:06:56.543 回答