5

MSSQL を試しているときに、説明できない動作に遭遇しました。

NULL 値が varchar に追加され、次のクエリを実行するとどうなるかを調べていました。

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

結果 'te' が得られます。同様に、単語 test を他の単語に変更すると、最初の 2 文字しか取得できません。+ ' ' 内のスペースの数を増やすと、結果に余分な文字が表示されます (したがって、NULL + '[2 つのスペース]' は 'tes' になります)。何が起こっているのですか?

変数を宣言して NULL に設定すると、たとえば

DECLARE @testnull AS varchar(32)

SET @testnull = NULL

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

次に、結果「テスト」を取得します(予想どおり)。

4

1 に答える 1

7

を使用しCOALESCEます。ISNULL最初のNON-NULL データ型を取り、この場合は宣言されていないため、 を取得しVARCHAR(1)、スペースを追加するNULLと になりVARCHAR(2)ます (これはまだNULL評価されているときですが、SQL Server はその前に仮定を行います。ステップ)。varcharwithout lengthのデフォルトが 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

ほとんどの場合、私COALESCEISNULL. このヒントでは、その理由 (および例外が存在する場所) について説明します。

于 2013-03-13T14:06:56.543 に答える