2015-03-02 146 views
0

我有一个数据库从应用程序收集数据。而现在,我必须创建另一列,根据其他列中的值,使用预定义的数据填充另一列。所以,没有数学,只需要查看其他两列中的值并将数据插入到新添加的列中即可。根据其他列值填充额外的数据库列

id  column1  column2 newColumn 
1  15   3   100 

因此,当列1有15个,并且列2具有3,newColumn应该是自动填充与100同样,编号100被predifned,不calcualted。

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

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

所以我可以使用更新来填充列对于已经录入的记录?!

我可以做一个触发器,它会等待两个值,直到两个都进入它将返回NULL?

+2

一般来说这不是一个很好的主意,存储计算的列值。太旧,不一致的值会被发现。如果真的需要,触发器很棒。但在大多数情况下,视图是“自动填充”的最佳解决方案! – jarlh 2015-03-02 08:12:38

+0

100被预测 - 意味着你的意思是它的一个随机数字发生器或应该是独特的请详细说明 – 2015-03-02 08:20:38

+0

@koushikveldanda我知道,当column1是15,column2是3,那么newColumn必须是100 .. – 2015-03-02 08:23:53

回答

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琼斯的答案更新与简单的更新语句当前的数据和表添加触发条件:

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 
+0

请注意,有一个计算列持久化(甚至有一个索引)并不能保证服务器不会选择重新计算查询中列的值。如果此列使用UDF,则优化器将愉快地调用UDF。 [用UDF定义的计算列可能影响查询性能](http://blogs.msdn.com/b/sqlcat/archive/2011/11/28/a-computed-column-defined-with-a-user- defined-function-might-impact-query-performance.aspx)http://dba.stackexchange.com/questions/18716/why-does-sql-server-compute-scalar-when-i-select-a-persisted-计算专栏 – 2015-03-02 10:17:22

+0

@giorgi有一个问题?如果column1和column2没有同时更新怎么办?当这两个字段都有值时,我希望触发器触发。这次更新你写了什么工作? – 2015-03-04 13:06:12

+0

@gogo_rulez,'如果更新(列1)和更新(列2)'这将在两个更新时触发。 '如果更新(列1)或更新(列2)',这将触发如果任何两个或两者都更新。 – 2015-03-04 13:19:33

0

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

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

    where 
     newColumn is null 

但是,请注意什么@jarlh上面说,通常有这样如视图或计算列的更好的方法。