2012-12-03 170 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