2011-02-14 69 views

回答

0

使用计算列和标量函数作为默认值。

+0

标量函数直到插入后才会有PK的值,所以udf在我的情况下无法帮助填充COLUMN_NUM – gbn 2011-02-14 20:58:43

1

创建计算

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

这种解决方案是不可接受的 – Taras 2011-02-14 20:58:46

0

我会通过触发器强制执行此操作。

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

如何让子表只存储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

使用NHibernate调用存储过程来插入数据,而不是使用直接插入通过.save方法可以给你更多的控制。

相关问题