3
我想下列要求定义在我的表中的列DEFAULT定义另一列:引用SQL Server 2005中
- 列应该插入的。如果该值在INSERT语句中提供,则应该插入它。
- 如果该列未在INSERT语句中引用,则应将其设置为两个其他列的总和。
由于第一个要求,我不能使用计算列,因为它们不可插入。由于第二,我不能使用DEFAULT,因为它不允许引用定义中的其他列。我还有什么其他选择?
顺便说一句,该列应该是NOT NULL。
我想下列要求定义在我的表中的列DEFAULT定义另一列:引用SQL Server 2005中
由于第一个要求,我不能使用计算列,因为它们不可插入。由于第二,我不能使用DEFAULT,因为它不允许引用定义中的其他列。我还有什么其他选择?
顺便说一句,该列应该是NOT NULL。
现在你去了,我用一个示例模式来演示这个,因为你没有提供真正的表/列名。
表:
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
基本上它取代上与一个触发器中的表进行任何insert语句,所以我检查使用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。
trigger ......... –
你能举个例子吗? – ercan