ROW_NUMBER関数の戻り値
SQL SERVERで行数を引っ張ってくる関数として、ROW_NUMBERというものがある。
結果セットのパーティション内の行について、各パーティションの最初の行を 1 とした連続する数値を返します。
Transact-SQL 構文表記規則
構文
ROW_NUMBER ( ) OVER ( [
] ) 引数
FROM 句で生成された結果セットを、ROW_NUMBER 関数が適用されるパーティションに分割します。PARTITION BY の構文については、「OVER 句 (Transact-SQL)」を参照してください。
ROW_NUMBER 値がパーティション内の行に割り当てられる順序を決定します。詳細については、「ORDER BY 句 (Transact-SQL)」を参照してください。が順位付け関数で使用される場合、整数値で列を表すことはできません。 戻り値の型
bigint...
http://msdn.microsoft.com/ja-jp/library/ms186734.aspx
まだSQLに関しては読める程度のレベルなのでヘルプを見つつ、
事故対応をしている今日この頃。
運用中のシステムのログ中に、
主キー重複エラーによる実行エラー*1が起きていた。
さっそく調査を開始。手順的には、
- DBから値を引く
- それを一時テーブルに入れる
- アプリからその一時テーブルを取得
というもの。
アプリからコードを追っていくと・・
行き着いたのが『ROW_NUMBERがNULLを返している』なのだが、
その返る条件が分からなかった。
ヘルプを見ると、戻りは『bigint型*2』とだけで
NULLを返すなんてどこにも書いてない。
行数の付加条件でOVER句を使ってORDERするのだが、
もしかしたらこのORDER部分がNULLになれば・・と期待し、
試しにあるテーブルAと検索関数をLEFT OUTER JOINし、
検索関数の戻りを0件にして実験したものの、ちゃんと付加しちゃった。
こーなるとお手上げなので、
素直に『分かりません』といっちゃった♪
でも、ちょっと悔しいので帰宅してせっせとGoogleしてみるものの、
それらしいのが出ない(google:ROW_NUMBER 戻り NULL)
う〜ん、検索の仕方がダメなのかな?