根据其他列值填充额外的数据库列

时间:2015-03-02 08:07:06

标签: sql sql-server database auto-populate

我有一个从应用程序收集数据的数据库。现在,我必须创建另一个列,该列将使用预定义数据填充,具体取决于其他列中的值。因此,没有数学,只需查找其他两列中的值并将数据插入新添加的列中。

实施例

id     column1     column2    newColumn
1      15          3          100

因此,当column1有15,而column2有3时,newColumn应自动填充为100.同样,数字100是预先计算的,而不是计算的。

我知道我可以为新条目使用触发器,但是数据库已经输入了大量数据,那么有没有办法自动填充newColumn以获取已经存在的数据?

编辑--------------------------------

所以我可以使用update来填充已经输入的记录的列?!

我可以制作一个等待两个值的触发器,直到两个值都输入它会返回NULL吗?

2 个答案:

答案 0 :(得分:2)

您可以创建标量函数:

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

持久意味着,该列不是即时计算的,而是保存数据。 这就是你使用WITH SCHEMABINDING的原因。如果没有绑定,则无法使列保持不变。

您还可以使用简单的更新语句更新当前数据,例如@Rhys Jones回答并在表格上添加触发器,如:

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 

答案 1 :(得分:0)

您可以使用单个UPDATE来更新缺失值,然后将TRIGGER用于新行。

    update MyTable set
        newColumn = case 
                        when column1 = 15 and column2 = 3 then 100
                        when ...
                    end

    where
        newColumn is null

但是,请注意@jarlh上面所说的内容,通常有更好的方法,例如视图或计算列。