3

我想在我的表中定义一个具有以下要求的列:

  1. 该列应该是可插入的。如果在 INSERT 语句中提供了该值,则应将其插入。
  2. 如果在 INSERT 语句中未引用该列,则应将其设置为其他两列的总和。

由于第一个要求,我不能使用计算列,因为它们不可插入。由于第二个原因,我不能使用 DEFAULT,因为它不允许引用定义中的其他列。我还有什么其他选择?

顺便说一句,该列不应为空。

4

1 回答 1

4

给你,我用一个示例模式来演示这一点,因为你没有提供你的真实表/列名。

桌子:

CREATE TABLE test
  (
     id   INT NOT NULL PRIMARY KEY IDENTITY, --made up key
     col1 INT, --first column to add, wasn't sure if this was nullable or not
     col2 INT, --second column to add, wasn't sure if this was nullable or not
     col3 INT NOT NULL --this is the column to optionally insert into
  ) 

这是触发器定义:

CREATE TRIGGER demo
ON test
INSTEAD OF INSERT
AS
    INSERT INTO test (col1,col2,col3)
    SELECT inserted.col1,
           inserted.col2,
           CASE
             WHEN inserted.col3 IS NULL THEN COALESCE(inserted.col1, 0) + COALESCE(inserted.col2, 0)
             ELSE inserted.col3
           END
    FROM   inserted

基本上它用触发器中的那个替换了在表上完成的任何插入语句,所以我使用inserted临时表来检查试图插入到我们的不可为空的可选列中的col3值是否为 NULL。如果是,我用添加col1和替换它col2(我用零合并,因为你没有提到两个源列是否可以为空)。

然后,您可以运行包含或不包含它的插入语句,尽管事实col3不可为空:

INSERT INTO test(col1,col2)
SELECT 12, 31
GO

INSERT INTO test(col1, col2, col3)
SELECT 1, 2, 89
GO

结果是:

ID  COL1 COL2 COL3
------------------  
1   12   31    43
2   1    2     89

如果触发器不存在,您可能会在尝试运行第一个插入语句时遇到错误,告诉您它无法将 NULL 插入col3.

另请注意,指定值的第二个插入语句并未按要求被添加替换。

这是一个有效的SQL Fiddle

于 2012-12-03T15:10:18.357 回答