2013-03-13 2 views
5

MSSQLを試している間に、私は説明できないいくつかの動作を経験しました。NULLをvarcharに追加するときにISNULLを使用する

私はそれをvarchar型に追加されたときにNULL値がどうなるかを見ていた、と私は次のクエリ実行するとき:

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

を私は「テ」の結果を得ます。同様に、他の言葉のために単語testを変更すると、最初の2文字しか得られません。 + 'のスペースを増やすと、結果に余分な文字が表示されます(NULL +' [2つのスペース]は私に 'テス'を与えます)。何が起こっているのでしょうか?

変数を宣言してNULLに設定した場合など。

DECLARE @testnull AS varchar(32) 

SET @testnull = NULL 

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

私は結果として「テスト」を得る(私が期待する通り)。

答えて

7

COALESCEを使用してください。 ISNULLを最初に NON-NULLデータ型にします。この場合、宣言されていないためNULLの場合はVARCHAR(1)になり、スペースを追加するとVARCHAR(2)になります。 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 

を、ほぼすべてのケースでは、私がCOALESCE上を好みます210。私はこのヒントで(どこで例外が存在する)理由を説明:

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

+1

はどのようにvarchar型は、(1) '' 'te''を取得 '来ますか? – Kaf

+2

@Kaf ''''を追加するとvarchar(2)になります。 –

+0

私の友人、あなたはこのニッチで私を驚かせることを止めない、素晴らしい答えのために+1! –

関連する問題