在向varchar添加NULL时使用ISNULL

时间:2013-03-13 14:05:45

标签: sql sql-server

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

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

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

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

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

DECLARE @testnull AS varchar(32)

SET @testnull = NULL

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

然后我得到结果'测试'(正如我所料)。

1 个答案:

答案 0 :(得分:7)

使用COALESCEISNULL采用第一个 NON-NULL数据类型,在这种情况下,因为它尚未声明,所以VARCHAR(1)获得了NULL然后在添加空格时它变为VARCHAR(2)(在评估时仍为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。我在这篇小贴士中解释了为什么(以及存在例外的地方):

http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/