Sql-Server

有條件地使用計算列

  • March 31, 2021

是否可以將不可為空的列設置為 a) 使用 INSERT/UPDATE 查詢自由添加值 b) 如果插入時未提供值,以避免空條目添加預設值到另一列的值?

我知道使用計算列我可以將預設值設置為另一個列值,但是我不能覆蓋它。

一個例子:

CREATE TABLE test (id INT,
                   val INT);
GO
CREATE TRIGGER tr
ON test
AFTER INSERT, UPDATE
AS
UPDATE test
SET val = 123     -- custom value which must be set instead of NULL
                  -- maybe any expression 
                  -- and even an output of the subquery
WHERE EXISTS ( SELECT NULL
               FROM INSERTED
               WHERE id = test.id
                 AND val IS NULL );
GO
INSERT INTO test VALUES (1,1), (2,null), (3,3);
SELECT * FROM test;
GO
編號 | 值
-: | --:
 1 | 1
 2 | 123 -- NULL 被替換為自定義值
 3 | 3
UPDATE test SET val = NULL where id = 1;
SELECT * FROM test;
GO
編號 | 值
-: | --:
 1 | 123 -- NULL 被替換為自定義值
 2 | 123
 3 | 3

db<>在這裡擺弄

雖然觸發器可能會像 Akina 的回答一樣正常工作,但我和 Charlieface 一起使用預設約束,因為這正是它要解決的問題,而且解決方案稍微一些。它也作為表定義的一部分存在,而不是作為需要維護的伺服器上的單獨對象,因此如果您要為表編寫腳本,預設約束將自動使用它編寫腳本,而不是Trigger

直接來自 Microsoft 的範例:

CREATE TABLE dbo.doc_exz 
(
     column_a INT,
     column_b INT DEFAULT 50
);

以上將允許您自由INSERTUPDATE column_b但如果您沒有指定進入表格column_b時的值INSERT,那麼它將預設為50.

這是與上面相同的範例,但為Default Constraint指定了一個名稱:

CREATE TABLE dbo.doc_exz 
(
    column_a INT,
    column_b INT CONSTRAINT DF_Doc_Exz_Column_B DEFAULT 50
);

引用自:https://dba.stackexchange.com/questions/288997