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

Sql 根据其他列值填充额外的数据库列,sql,sql-server,database,auto-populate,Sql,Sql Server,Database,Auto Populate,我有一个从应用程序收集数据的数据库。现在,我必须创建另一列,该列将根据其他列中的值填充预定义数据。因此,不需要数学运算,只需在另外两列中查找值并将数据插入新添加的列中即可 范例 id column1 column2 newColumn 1 15 3 100 因此,当column1有15个,column2有3个时,newColumn应该自动填充100。同样,数字100是预先确定的,而不是计算出来的 我知道我可以对新条目使用触发器

我有一个从应用程序收集数据的数据库。现在,我必须创建另一列,该列将根据其他列中的值填充预定义数据。因此,不需要数学运算,只需在另外两列中查找值并将数据插入新添加的列中即可

范例

id     column1     column2    newColumn
1      15          3          100
因此,当column1有15个,column2有3个时,newColumn应该自动填充100。同样,数字100是预先确定的,而不是计算出来的

我知道我可以对新条目使用触发器,但数据库已经输入了大量数据,所以有没有办法自动填充已输入数据的newColumn

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

所以我可以使用更新来填充已输入记录的列


我可以创建一个触发器,它将等待两个值,并且在输入这两个值之前,它将返回NULL吗?

您可以只使用一次更新来更新缺少的值,然后对新行使用触发器

    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
持久化意味着不动态计算该列,而是保存数据。 这就是为什么在SCHEMABINDING中使用
。如果没有绑定,则无法使列持久化

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

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 

一般来说,存储计算的列值不是一个好主意。经常会发现旧的、不一致的值。如果真的需要,触发器是很好的。但在大多数情况下,视图是“自动填充”的最佳解决方案!100是预先定义的——意思是什么?它是一个随机数生成器还是应该是唯一的elaborate@koushikveldanda我预先知道,当column1为15,column2为3时,newColumn必须为100。请注意,保留计算列(甚至在其上有索引)不保证服务器不会选择在查询中重新计算列的值。若这样的列使用UDF,优化器将愉快地调用UDF@乔治:有一个问题吗?如果column1和column2没有同时更新呢。我希望在这两个字段都有值时触发触发器。你写的这个更新有用吗?@gogo_rulez,
如果更新(第1列)和更新(第2列)
这两个更新都会触发<代码>如果更新(第1列)或更新(第2列)
并且如果两个或两个中的任何一个都更新,则会触发此命令。