を別の列の値を設定することはできませんので、あなたが、私は2つのテーブル持ってお勧めこのためのトリガーを必要とする:生を保持するステージング表を外部プログラムからのデータと、ビジネスルールが適用された第2のテーブルとを含む。この第2のテーブルは、単純に例えばVIEW
とすることができる。 (私はCTEを使用してサンプルデータでステージングテーブルをシミュレートしていますが、SQL Serverは真のブール型ではないため、CHAR(1)
列を使用してシミュレーションしています。 some_flag
にそれを変更):!
WITH Staging
AS
(
SELECT *
FROM (
VALUES (0, 3750, 'T'),
(1, 5000, 'T'),
(2, 5000, 'F')
) AS T (ROW, ValueA, some_flag)
)
SELECT ROW, ValueA, some_flag,
0 AS ValueB
FROM Staging
WHERE (ValueA <= 3750 OR some_flag = 'T')
UNION
SELECT ROW, 3750 AS ValueA, some_flag,
(ValueA - 3750) AS ValueB
FROM Staging
WHERE ValueA > 3750 AND some_flag = 'F';
2番目のテーブルには、ベーステーブルになりたい場合は、伝統的なロジックを使用して、次の制約は、()を適用するように見えるでしょう:
IF some_flag = 'F' THEN ValueA <= 3750
IF some_flag = 'T' THEN ValueB = 0
IF some_flag = 'F' AND ValueA < 3750 THEN ValueB = 0
SQLのようにCHECK
制約(私はいくつかの '常識'のビジネスルールを推測しています):
CREATE TABLE MyTable
(
ROW INTEGER NOT NULL UNIQUE,
ValueA INTEGER NOT NULL CHECK (ValueA > 0),
some_flag CHAR(1) NOT NULL CHECK (some_flag IN ('T', 'F')),
ValueB INTEGER NOT NULL CHECK (ValueB >= 0),
CHECK (some_flag <> 'F' OR ValueA <= 3750),
CHECK (some_flag <> 'T' OR ValueB = 0),
CHECK (some_flag <> 'F' OR ValueA >= 3750 OR ValueB = 0)
);
上記のクエリを使用して、ステージングテーブルからベーステーブルにデータをコピーできます。ただし、制約に違反することはありませんが、クエリが間違っていると失敗することはありません。
ありがとう、真の偽のビットのためのより良い名前を思い付くことができませんでした、それは確かにTまたはFを含むcharフィールドです。あなたの洞察力をありがとう。私は例としてこれを私の答えとしてマークします。 – Raskaroth