在尝试使用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')
然后我得到结果'测试'(正如我所料)。
答案 0 :(得分:7)
使用COALESCE
。 ISNULL
采用第一个 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/