2011-02-14 8 views

答えて

0

計算列とスカラー関数をデフォルト値として使用します。

+0

挿入後にスカラー関数の値がPKになることはありませんので、udfはCOLUMN_NUMを入力するのに役立ちません。 – gbn

1

PK値は(もちろん)INSERTまで知られていない

CREATE TABLE MyTable (
    COLUMN_PK int NOT NULL identity(1,1) , 
    ... 
    COLUMN_NUM_internal int NULL, 
    COLUMN_NUM AS COALESCE (COLUMN_NUM_internal, COLUMN_PK), 
    ... 
) 

計算される3番目の列を作成します。しかし、あなたはこれのようなことをしたり、トリガーを使ってCOLUMN_NUMを更新したりすることはありません。ただし、上記のこのソリューションは、余分なコード(更新のための別のトリガー)を使用することなく、その後の更新でも機能します。

+0

私の場合、この解決策は受け入れられません。 – Taras

+0

@ user616719:なぜですか? – gbn

+0

これにより、休止状態のレイヤーが複雑になります。また、column_numを更新しようとすると複雑になります。これは非常に困難です。良い解決策には、読んだ列と更新する列があります。 – RichardTheKiwi

0

私はこれをトリガで強制します。

0

子テーブルにCOLUMN_PKとCOLUMN_NUMを格納するのはどうですか?この表は、COLUMN_NUM値が指定されている場合にのみレコードを持ちます。次に、あなたが行うことができます。

CREATE TABLE Parent (COLUMN_PK int NOT NULL identity(1,1), someCol int NOT NULL) 
CREATE TABLE Child (COLUMN_PK int NOT NULL, COLUMN_NUM int NOT NULL) 

INSERT INTO Parent (someCol) VALUES (1) 
INSERT INTO Parent (someCol) VALUES (2) 
INSERT INTO Parent (someCol) VALUES (3) 
INSERT INTO Parent (someCol) VALUES (4) 
INSERT INTO Parent (someCol) VALUES (5) 
INSERT INTO Child VALUES (1, 10) 
INSERT INTO Child VALUES (3, 30) 
INSERT INTO Child VALUES (5, 50) 

SELECT COLUMN_PK, 
     CASE WHEN EXISTS (SELECT NULL FROM Child WHERE Child.COLUMN_PK = Parent.COLUMN_PK) 
      THEN (SELECT COLUMN_NUM FROM Child WHERE Child.COLUMN_PK = Parent.COLUMN_PK) 
      ELSE COLUMN_PK 
     END 
FROM Parent 
0

を.SAVE方法を経由して直接挿入はあなたより多くの制御を与えることができるデータを挿入するストアドプロシージャを呼び出すのではなく、使用するNHibernateはを使用しました。

関連する問題