根据其他列值填充额外的数据库列
Populate extra database column depending on other column values
我有一个从应用程序收集数据的数据库。现在,我必须创建另一个列,该列将根据其他列中的值填充预定义数据。因此,无需数学运算,只需查找其他两列中的值并将数据插入新添加的列中。
例子
id column1 column2 newColumn
1 15 3 100
所以当 column1 有 15,column2 有 3 时,newColumn 应该自动填充 100。同样,数字 100 是预定义的,而不是计算的。
我知道我可以对新条目使用触发器,但是数据库已经输入了大量数据,那么有没有办法为已经存在的数据自动填充 newColumn?
编辑 ------------------------------
所以我可以使用更新来填充已输入记录的列?!
我可以创建一个触发器来等待两个值,直到输入两个值,它才会 return NULL 吗?
您可以只使用单个 UPDATE 更新缺失值,然后使用 TRIGGER 更新新行。
update MyTable set
newColumn = case
when column1 = 15 and column2 = 3 then 100
when ...
end
where
newColumn is null
但是,请注意@jarlh 上面所说的内容,通常有更好的方法来执行此操作,例如视图或计算列。
您可以创建标量函数:
ALTER FUNCTION [dbo].[Test] ( @column1 INT, @column2 INT)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
DECLARE @r INT
IF @column1 = 15 AND @column2 = 3
SET @r = 100
ELSE
SET @r = NULL
RETURN @r
END
然后添加新的计算列:
ALTER TABLE TableName ADD ColumnName AS dbo.Test(column1, column2) PERSISTED
Persisted 意味着,该列不是即时计算的,而是保存数据的。
这就是您使用 WITH SCHEMABINDING
的原因。如果没有绑定,您将无法使该列持久化。
您还可以使用简单的更新语句更新当前数据,例如@Rhys Jones 的回答,并在 table 上添加触发器,例如:
ALTER TRIGGER trTest ON TableName
AFTER INSERT, UPDATE
AS
BEGIN
IF UPDATE(column1) AND UPDATE(column2)
BEGIN
UPDATE TableName
SET NewColumn = CASE
WHEN column1 = 15 and column2 = 3 then 100
ELSE NULL
END
FROM Inserted i
JOIN TableName t ON t.id = i.id
END
END
我有一个从应用程序收集数据的数据库。现在,我必须创建另一个列,该列将根据其他列中的值填充预定义数据。因此,无需数学运算,只需查找其他两列中的值并将数据插入新添加的列中。
例子
id column1 column2 newColumn
1 15 3 100
所以当 column1 有 15,column2 有 3 时,newColumn 应该自动填充 100。同样,数字 100 是预定义的,而不是计算的。
我知道我可以对新条目使用触发器,但是数据库已经输入了大量数据,那么有没有办法为已经存在的数据自动填充 newColumn?
编辑 ------------------------------
所以我可以使用更新来填充已输入记录的列?!
我可以创建一个触发器来等待两个值,直到输入两个值,它才会 return NULL 吗?
您可以只使用单个 UPDATE 更新缺失值,然后使用 TRIGGER 更新新行。
update MyTable set
newColumn = case
when column1 = 15 and column2 = 3 then 100
when ...
end
where
newColumn is null
但是,请注意@jarlh 上面所说的内容,通常有更好的方法来执行此操作,例如视图或计算列。
您可以创建标量函数:
ALTER FUNCTION [dbo].[Test] ( @column1 INT, @column2 INT)
RETURNS INT
WITH SCHEMABINDING
AS
BEGIN
DECLARE @r INT
IF @column1 = 15 AND @column2 = 3
SET @r = 100
ELSE
SET @r = NULL
RETURN @r
END
然后添加新的计算列:
ALTER TABLE TableName ADD ColumnName AS dbo.Test(column1, column2) PERSISTED
Persisted 意味着,该列不是即时计算的,而是保存数据的。
这就是您使用 WITH SCHEMABINDING
的原因。如果没有绑定,您将无法使该列持久化。
您还可以使用简单的更新语句更新当前数据,例如@Rhys Jones 的回答,并在 table 上添加触发器,例如:
ALTER TRIGGER trTest ON TableName
AFTER INSERT, UPDATE
AS
BEGIN
IF UPDATE(column1) AND UPDATE(column2)
BEGIN
UPDATE TableName
SET NewColumn = CASE
WHEN column1 = 15 and column2 = 3 then 100
ELSE NULL
END
FROM Inserted i
JOIN TableName t ON t.id = i.id
END
END