2013-03-13 70 views
5

在嘗試使用MSSQL時,遇到了一些我無法解釋的行爲。將NULL添加到varchar時使用ISNULL

我看着它時被添加到一個varchar會發生什麼NULL值,當我做下面的查詢:

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

我得到的結果是「德」。同樣,如果我更改任何其他單詞的單詞測試,我只會得到前兩個字母。如果我在+中增加空格的數量,我會在結果中得到額外的字母(所以NULL +'[two spaces]'給了我'tes')。任何想法是怎麼回事?

如果我聲明一個變量並將其設置爲NULL,例如

DECLARE @testnull AS varchar(32) 

SET @testnull = NULL 

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

然後我得到結果'測試'(正如我所期望的)。

回答

7

使用COALESCEISNULL採取第一非NULL數據類型,在這種情況下,因爲它沒有被宣佈,你得到的NULL一個VARCHAR(1),然後就變成了VARCHAR(2)當您添加的空間(評估時,這仍是NULL但SQL Server在該步驟之前進行假設)。在某些情況下,不帶長度的varchar的缺省值爲1,而在其他情況下,缺省值爲30.我會讓你猜猜這裏使用的是哪一個。

SELECT 
ISNULL(NULL + ' ', 'test'), COALESCE(NULL + ' ', '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]%'; 

結果:

---- ---- 
te test 

你可以看到這個明確

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

在幾乎所有情況下,我更喜歡在COALESCEISNULL。我解釋了爲什麼(凡存在例外)在此提示:

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

+1

爲什麼'VARCHAR(1)''獲得「te''? – Kaf 2013-03-13 14:09:42

+2

@Kaf當你添加''''時,它變成varchar(2)。 – 2013-03-13 14:10:03

+0

我的朋友,你不停地驚歎於我在這個利基,+1一個美妙的答案! – 2013-03-13 14:17:00