更新ステートメントを使用してテーブルの行を反復し、以前の値と現在の値がどのように似ているかによって、各行の単一の列に値を割り当てようとしていますカーソルがどのように機能するかについて説明します。カーソルと似たt-sqlの更新ステートメント
初期テーブル・データ:だから
|PK|EffectiveDate|ChangeDate|ActionType|
| 1| 2015-01-01| NULL| Add|
| 2| 2015-03-01|2015-03-01| Change|
...
は、ここに私のコードです:
declare @prevPK int = null
, @prevEffDate date = null
, @prevChangeDate date = null
, @prevActionType varchar(50) = null
update mytable
set ActionType = case when isnull(@prevChangeDate,'1900-01-01')<=ChangeDate then 'Change'
else 'Add'
end
, @prevPK = PK
, @prevEffDate = prevEffDate
, @prevChangeDate = prevChangeDate
, @prevActionType = prevActionType
...これは、各行に対して変数を更新し、比較を行うと、それぞれにACTIONTYPEを設定します適切に行。ただし、case文は適切に評価されていません。
私は正しい順序で設定された課題を持っていますか?
これはSQL Server 2008 R2上にあります。
さらに詳しい説明が必要な場合はお知らせください。 ありがとう! -Wesley
SQL Server 2008では、テーブルに多数の行がある場合、テーブルを自己結合するのではなく、カーソルを使用する方が効率的です。 SQL Server 2012以降では、 'LAG'関数を使用して「前の」行から値を取得できます。 –
あなたの要件に必要な行単位の操作が本当に必要な場合、再帰的なCTEは悪くありません。 – KumarHarsh
@ VladimirBaranov、セルフ・ジョインを使って同じことをすることができるときにカーソルが効率的になる方法は? – KumarHarsh