1

テーブルに欠損値を挿入するトリガーを作成しようとしています。私はSQL Server Expressを使用しています テーブルがあります

create table test 
(suma int ,
summ_year int,
summ_month int 
);

次に、1 つのテスト値を挿入します

INSERT  into test (suma)values (4951)

summテーブル内の値に基づいて値を計算するトリガーを作成するよりも

create trigger updatetest
on test
AFTER update
as update test
set summ_year = round(suma*1.85,0 ),summ_month = round(summ_year/12,0)

1.85固定値と12月はどこですか

私がスマを更新するよりも

update test  set suma = 4950

選択して、それがどのように機能するかを確認します

select * from test

選択からの戻りは次のようになります4950 9158 NULL ただし、計算する必要があるトリガーの2番目の部分はsumm_month = round(summ_year/12,0)NULL値を返します。

また、この選択を実行すると

select summ_month = round(summ_year/12,0) from test

それは働いています。それを修正する方法はありますか?

4

1 に答える 1

1

計算列を使用しない理由:

create table test 
(suma int ,
summ_year as round(suma*1.85,0 ),
summ_month as round(round(suma*1.85,0 )/12,0) 
);

引き金も、騒ぎも、大騒ぎもありません。

なぜあなたUPDATEが働いていないのですか?ステートメント内の式はSET、並列で評価されるかのように計算されることを意図しています。それらは確かに左から右に評価されません。したがって、 を計算している時点ではsumm_month = round(summ_year/12,0)summ_yearはまだ更新されておらず、まだNULLです。

この動作の良い結果は、2 つの列の値を交換するには、次のように書くだけでよいということです。

UPDATE tab SET a = b, b = a

そして、それは正しいことをします。

(何らかの奇妙な理由で)これらの計算をトリガーで引き続き実行したい場合は、上部の計算列に対して行ったのと同じようにする必要があります-月を計算する際に年値を計算する式を繰り返します価値:

update test
set summ_year = round(suma*1.85,0 ),summ_month = round(round(suma*1.85,0 )/12,0)
于 2013-03-01T07:06:46.363 に答える