Hibernate, SQL Server: как я могу использовать значение по умолчанию в качестве значения из другого столбца - PullRequest
4 голосов
/ 14 февраля 2011

Например: у меня есть столбец COLUMN_PK типа int identity (1,1) и столбец COLUMN_NUM pf типа int, как я могу определить значение по умолчанию для COLUMN_NUM - значение COLUMN_PK?

Так что если у меня есть сущностьс не заданным значением COLUMN_NUM будет заполнено сгенерированным значением из COLUMN_PK.Но если указано COLUMN_NUM, будет использоваться его значение.

Ответы [ 5 ]

1 голос
/ 14 февраля 2011

Создайте 3-й столбец, который вычисляется

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),
   ...
)

Значение PK неизвестно до INSERT (конечно).Но не раньше, поэтому вы должны сделать что-то подобное или использовать триггер для обновления COLUMN_NUM.Однако это решение выше работает и для последующих обновлений без дополнительного кода (т. Е. Еще один триггер для обновления)

0 голосов
/ 03 марта 2011

Использование NHibernate для вызова хранимой процедуры для вставки данных, а не прямая вставка через метод .save, может дать вам больше контроля.

0 голосов
/ 22 февраля 2011

Как насчет того, чтобы иметь дочернюю таблицу для хранения только 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 голосов
/ 14 февраля 2011

Я бы применил это через триггер.

create trigger tr_IU_YourTable on YourTable
for insert,update
as
begin
    update yt
        set column_num = yt.column_pk
        from inserted i
            inner join YourTable yt
                on i.column_pk = yt.column_pk
                    and yt.column_num is null
end
go
0 голосов
/ 14 февраля 2011

Использовать вычисляемый столбец и скалярную функцию в качестве значения по умолчанию.

...