-1

ストアド プロシージャ (SQL サーバー 2008r2) を作成したいのですが、テーブルがあるとします。

人

列:
ID int (pk)
Date_of_birth 日付が null ではない
Phone int allow null
Address int null を許可
名前 nvarchat(50) が null ではない

サンプルデータ: Id=1,Date_of_birth=01/01/1987,phone=88888888,address=null,name='Steve'

ストアド プロシージャ内のステートメントを更新します。パラメーターは既に宣言されていると仮定します。 Update person set Date_of_birth=@dob,phone=@phone,address=@address,name=@name where id=@id

テーブルには、変更をログに記録するトリガーがあります。上記の person テーブルを更新するための asp.net 更新ページができました。

問題は、ユーザーが address='apple street' を更新したいだけの場合、上記の update ステートメントはすべてのフィールドを更新しますが、元の値 = 新しい値かどうかをチェックせず、このフィールドを無視して次のフィールドをチェックします。したがって、列が更新されない場合でも、ログ テーブルにすべてのイベントが記録されます。

この時点で、私の解決策

  1. ID ですべての値を選択し、それらをローカル変数に格納します。if-else チェックを使用して更新ステートメントを生成します。最後に、生成された SQL (sp_executesql) を動的に実行します。
  2. ID ですべての値を選択し、それらをローカル変数に格納します。if-else チェックを使用して、各フィールドを個別に更新します。

If @dob <> @ori_dob
Begin
Update person set date_of_birth=@dob where id=@id
End

これはばかげた質問かもしれませんが、より良いアイデアがあればアドバイスをお願いします。

4

1 に答える 1

0

これは OP によるコメントへの回答であり、元の質問には対応していません。しかし、それはかなり醜いコメントになるでしょう。

次のようなステートメントを使用して、トリガーAddress内の変更を見つけることができます。UPDATE

select i.Id, d.Address as OldAddress, i.Address as NewAddress
  from inserted as i inner join
    deleted as d on d.Id = i.Id
  where d.Address <> i.Address

ログに記録する列ごとに、そのようなステートメントが 1 つ必要になります。

SELECTの結果を単一のテーブル変数に蓄積してから、それぞれの結果を要約できIdます。INSERTまたは、 /を使用SELECTして、結果をログ テーブルに直接保存することもできます。

于 2012-07-17T13:07:42.633 に答える