makoラボ

日常や勉強会や技術ネタ

T-SQLのEXECUTEの引数内で+演算子で結合した時の挙動

T-SQLでEXECUTEを使用している時に、引数内で+演算子SQLを組み立てた場合に以下の様な挙動をするようです。

BEGIN
  DECLARE @A AS VARCHAR(MAX) = NULL
  DECLARE @B AS VARCHAR(MAX)

  -- パターン1:先に結合した文字列を作ってからEXECUTEに渡す
  SET @B = 'SELECT ''' + @A + ''' AS COL1'
  EXECUTE(@B)
  
  -- パターン2:EXECUTEの引数内で+演算子でSQLを組み立てる
  EXECUTE('SELECT ''' + @A + ''' AS COL1')


  -- =========================================
  -- 結果
  -- =========================================
  -- パターン1: @BがNULLのため何も結果が得られない
  -- パターン2: @Aを空文字列として組み立てられた「SELECT '' AS COL1」が実行される
END

感覚的に@BがNULLになるのと同様に、EXECUTEの引数がNULLになるのかと思っていたのですが、 実際に実行してみるとNULLの部分が空文字に置き換えられて実行されてしまうようです。

あまりこういった事をすることは無いと思いますが、EXECUTE内でSQLを組み立てている場合で思った挙動と違う場合はこれを疑ってみてください。

参考:EXECUTE (Transact-SQL)