例:COLUMN_PK型のint型(1,1)の列とCOLUMN_NUM型のint型の列があります。 - COLUMN_PKの値は?Hibernate、SQL Server:別の列の値としてデフォルト値を使用する方法
したがって、COLUMN_NUMが指定されていないエンティティがある場合、COLUMN_PKから生成された値が入力されます。しかし、COLUMN_NUMが指定されていれば、その値が使用されます。
例:COLUMN_PK型のint型(1,1)の列とCOLUMN_NUM型のint型の列があります。 - COLUMN_PKの値は?Hibernate、SQL Server:別の列の値としてデフォルト値を使用する方法
したがって、COLUMN_NUMが指定されていないエンティティがある場合、COLUMN_PKから生成された値が入力されます。しかし、COLUMN_NUMが指定されていれば、その値が使用されます。
計算列とスカラー関数をデフォルト値として使用します。
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を更新したりすることはありません。ただし、上記のこのソリューションは、余分なコード(更新のための別のトリガー)を使用することなく、その後の更新でも機能します。
私の場合、この解決策は受け入れられません。 – Taras
@ user616719:なぜですか? – gbn
これにより、休止状態のレイヤーが複雑になります。また、column_numを更新しようとすると複雑になります。これは非常に困難です。良い解決策には、読んだ列と更新する列があります。 – RichardTheKiwi
私はこれをトリガで強制します。
子テーブルに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
を.SAVE方法を経由して直接挿入はあなたより多くの制御を与えることができるデータを挿入するストアドプロシージャを呼び出すのではなく、使用するNHibernateはを使用しました。
挿入後にスカラー関数の値がPKになることはありませんので、udfはCOLUMN_NUMを入力するのに役立ちません。 – gbn