2015-03-02 3 views
0

У меня есть база данных, которая собирает данные из приложения. И теперь мне нужно создать еще один столбец, который будет заполнен предопределенными данными в зависимости от значений в других столбцах. Итак, нет математики, просто чтобы посмотреть значения в двух других столбцах и вставить данные в недавно добавленный столбец.Заполнение дополнительного столбца базы данных в зависимости от других значений столбца

Пример

id  column1  column2 newColumn 
1  15   3   100 

Так что, когда столбец1 имеет 15, и имеет 3 столбец2, то newColumn должно быть автоматически заполняется 100. Опять же, число 100 predifned, не calcualted.

Я знаю, что я могу использовать триггеры для новых записей, но база данных уже содержит большой объем данных, так что есть способ автоматически заполнить новый столб для данных, которые уже существуют?

EDIT --------------------------------

Так что я могу использовать обновление для заполнения столбца для записей, которые уже введены?!

Могу ли я вызвать триггер, который будет ожидать оба значения, и пока оба не будут введены, он вернет NULL?

+2

В целом это не очень хорошая идея, чтобы сохранить вычисленные значения столбцов. Слишком часто встречаются старые, непоследовательные значения. Если это действительно необходимо, триггеры великолепны. Но в большинстве случаев представление является лучшим решением для «автоматического заполнения»! – jarlh

+0

100 - это означает, что вы имеете в виду его генератор случайных чисел или должны быть уникальными. Пожалуйста, уточните –

+0

@koushikveldanda. Я знаю, что, когда column1 равен 15, а column2 равен 3, тогда newColumn должен быть 100 .. –

ответ

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

Имейте в виду, что наличие вычисленного столбца сохраняется (и даже имеет индекс на нем), не гарантирует, что сервер не захочет пересчитать значение столбца в запросах. В случае, если такой столбец использует UDF, оптимизатор будет счастливо называть UDF. [Вычисленная колонка, определяемая с помощью производительности запросов на производительность UDF) (http://blogs.msdn.com/b/sqlcat/archive/2011/11/28/a-computed-column-defined-with-a-user- определенный-function-might-impact-query-performance.aspx) http://dba.stackexchange.com/questions/18716/why-does-sql-server-compute-scalar-when-i-select-a-persisted- расчетная колонка –

+0

@giorgi один вопрос? что, если столбцы1 и столбец2 не обновляются одновременно. Я хочу, чтобы триггер срабатывал, когда оба этих поля имеют значения. Будет ли это ОБНОВЛЕНИЕ вы написали работу? –

+0

@gogo_rulez, 'IF UPDATE (column1) AND UPDATE (column2)' это будет срабатывать, когда оба будут обновлены. 'IF UPDATE (column1) ИЛИ UPDATE (column2)', и это будет срабатывать, если будет обновлен любой из двух или обоих. –

0

Вы можете просто использовать один UPDATE для обновления отсутствующих значений, а затем использовать TRIGGER для новых строк.

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

    where 
     newColumn is null 

Однако обратите внимание на то, что говорит @jarlh выше, обычно есть лучшие способы сделать это, например, виды или вычисленные столбцы.

Смежные вопросы