我想在我的表中定义一个具有以下要求的列:
- 该列应该是可插入的。如果在 INSERT 语句中提供了该值,则应将其插入。
- 如果在 INSERT 语句中未引用该列,则应将其设置为其他两列的总和。
由于第一个要求,我不能使用计算列,因为它们不可插入。由于第二个原因,我不能使用 DEFAULT,因为它不允许引用定义中的其他列。我还有什么其他选择?
顺便说一句,该列不应为空。
我想在我的表中定义一个具有以下要求的列:
由于第一个要求,我不能使用计算列,因为它们不可插入。由于第二个原因,我不能使用 DEFAULT,因为它不允许引用定义中的其他列。我还有什么其他选择?
顺便说一句,该列不应为空。
给你,我用一个示例模式来演示这一点,因为你没有提供你的真实表/列名。
桌子:
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。