3

次の要件を使用して、テーブルに列を定義したいと思います。

  1. カラムは挿入可能である必要があります。値がINSERTステートメントで指定されている場合は、挿入する必要があります。
  2. 列がINSERTステートメントで参照されていない場合は、他の2つの列の合計に設定する必要があります。

最初の要件のため、計算列は挿入できないため、ユーザーは使用できません。2番目の理由で、定義内の他の列を参照できないため、DEFAULTを使用できません。他にどのようなオプションがありますか?

ところで、列はNOTNULLである必要があります。

4

1 に答える 1

4

ほら、実際のテーブル/列名を提供していないので、スキーマの例でこれを示しています。

テーブル:

CREATE TABLE test
  (
     id   INT NOT NULL PRIMARY KEY IDENTITY, --made up key
     col1 INT, --first column to add, wasn't sure if this was nullable or not
     col2 INT, --second column to add, wasn't sure if this was nullable or not
     col3 INT NOT NULL --this is the column to optionally insert into
  ) 

トリガーの定義は次のとおりです。

CREATE TRIGGER demo
ON test
INSTEAD OF INSERT
AS
    INSERT INTO test (col1,col2,col3)
    SELECT inserted.col1,
           inserted.col2,
           CASE
             WHEN inserted.col3 IS NULL THEN COALESCE(inserted.col1, 0) + COALESCE(inserted.col2, 0)
             ELSE inserted.col3
           END
    FROM   inserted

基本的に、テーブルで実行された挿入ステートメントをトリガー内のステートメントに置き換えるため、inserted一時テーブルを使用して、null 非許容のオプション列に挿入しようとしている値col3が NULL かどうかを確認します。col1そうである場合は、それをandの追加に置き換えますcol2(2 つのソース列が null 可能かどうかについて言及していないため、ゼロと合体しています)。

col3その後、 null 許容ではないという事実にもかかわらず、それを含むかどうかにかかわらず、insert ステートメントを実行できます。

INSERT INTO test(col1,col2)
SELECT 12, 31
GO

INSERT INTO test(col1, col2, col3)
SELECT 1, 2, 89
GO

結果は次のとおりです。

ID  COL1 COL2 COL3
------------------  
1   12   31    43
2   1    2     89

トリガーが存在しない場合、最初の挿入ステートメントを実行しようとしたときにエラーが発生し、 NULL を に挿入できないことが通知された可能性がありますcol3

また、値を指定する 2 番目の挿入ステートメントが、要求どおりに追加で置き換えられていないことにも注意してください。

これが実際のSQL Fiddleです。

于 2012-12-03T15:10:18.357 に答える