Как обновить вычисляемый столбец в таблице SQL - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть таблица с вычисляемым столбцом, как показано ниже (см. IsFlag столбец)

CREATE TABLE [TableName]
(
    [ID] [INT] IDENTITY(1,1) NOT NULL,
    [IsFlag1] [BIT] NOT NULL,
    [IsFlag2] [BIT] NOT NULL,
    [IsFlag3] [BIT] NOT NULL,
    [IsFlag] AS (CASE WHEN [IsFlag1] = (1) OR [IsFlag2] = (1) OR [IsFlag3] = (1) THEN (1) ELSE (0) END)
)

На вычисляемый столбец ссылаются несколько индексов и представлений.

Теперь,Мне нужно добавить еще один флаг [IsFlag4] [BIT] NOT NULL в таблицу и обновить вычисляемый столбец до

[IsFlag] AS (CASE WHEN [IsFlag1] = (1) OR [IsFlag2] = (1) OR 
                       [IsFlag3] = (1) OR [IsFlag4] = (1) 
                  THEN (1) ELSE (0) END)

Таблица содержит огромное количество данных, а также отбрасывание и создание всех индексов, представления - это проблема,

Каковы мои варианты реализации этого изменения с минимальным временем простоя?

Спасибо,

1 Ответ

0 голосов
/ 08 февраля 2019

Это вычисляемый столбец, он не занимает пробел (если не указано как PERSISTED )

Поэтому удалите и добавьте его снова с новым вычислением после добавления «IsFlag4».

Пример использования временной таблицы:

IF OBJECT_ID('tempdb..#TableName', 'U') IS NOT NULL DROP TABLE #TableName; 
CREATE TABLE #TableName
(
    [ID] [INT] PRIMARY KEY IDENTITY(1,1) NOT NULL,
    [IsFlag1] [BIT] NOT NULL DEFAULT 0,
    [IsFlag2] [BIT] NOT NULL DEFAULT 0,
    [IsFlag3] [BIT] NOT NULL DEFAULT 0,
    [IsFlag] AS (CASE WHEN [IsFlag1] = 1 OR [IsFlag2] = 1 OR [IsFlag3] = 1 THEN 1 ELSE 0 END)
);

CREATE INDEX idx_TableName_IsFlag ON #TableName ([IsFlag]);  

insert into #TableName (IsFlag1, IsFlag2, IsFlag3) values (0,0,0),(0,0,1);

-- Add [IsFlag4]
ALTER TABLE #TableName ADD [IsFlag4] [BIT] NOT NULL DEFAULT 0;

-- Drop and Add [IsFlag]
-- Drop index first, and add it again after
BEGIN
  DROP INDEX idx_TableName_IsFlag ON #TableName;
  ALTER TABLE #TableName DROP COLUMN [IsFlag];
  ALTER TABLE #TableName ADD [IsFlag] AS ([IsFlag1] | [IsFlag2] | [IsFlag3] | [IsFlag4]);
  CREATE INDEX idx_TableName_IsFlag ON #TableName ([IsFlag]);
END;

insert into #TableName (IsFlag1, IsFlag2, IsFlag3, IsFlag4) values (0,0,0,1);

select * from #TableName;

Возвращает:

ID  IsFlag1 IsFlag2 IsFlag3 IsFlag4 IsFlag
1   0       0       0       0       0
2   0       0       1       0       1
3   0       0       0       1       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...