2012-12-03 165 views
3

我想下列要求定义在我的表中的列DEFAULT定义另一列:引用SQL Server 2005中

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

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

顺便说一句,该列应该是NOT NULL。

+0

trigger ......... –

+0

你能举个例子吗? – ercan

回答

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 

基本上它取代上与一个触发器中的表进行任何insert语句,所以我检查使用inserted临时表来查看试图插入到我们的不可为空的可选列col3中的值是否为NULL。如果是,我将其替换为col1col2(因为您没有提及两个源列是否可以为空),所以我将它们替换为零。

然后,您可以运行插入语句其中将它包含与否,尽管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