2015-08-04 2 views
0

Мне нужно изменить логику вычислений для существующего вычисленного столбца в SQL Server.SQL Server: как воссоздать вычисленный столбец * только один раз *

И я хочу сохранить имя столбца без изменений.

Я написал сценарий для выполнения этой работы. И сценарий будет

  1. Отбросьте вычисляемый столбец
  2. Воссоздать вычисляемый столбец с новой вычислительной логики с таким же именем.

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

Есть ли способ избежать удаления этого столбца и создания его более одного раза?

Один из способов, которым я мог подумать, - создать фиктивное ограничение проверки. Итак, перед тем, как сбросить и воссоздать вычисляемый столбец, сначала проверьте, существует ли это ограничение проверки фиктивных ошибок.

Если он не существует, то создайте ограничение фиктивной строки и отпустите/создайте вычисленный столбец.

Не уверен, есть ли другой простой способ решить эту проблему.

+0

Зачем вам это нужно? - Я думаю, что у вас может быть два столбца, затем создать два представления из вашей таблицы, а затем использовать каждое из этих представлений (с одинаковым столбцом имен из разных столбцов) в ваших случаях;). –

+0

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

+0

Для нормальных столбцов это довольно просто, я могу обновить данные столбца напрямую без капли и воссоздания. Однако он отличается от вычисленного столбца. – Buzz

ответ

0

вы можете полагаться на computed_columns систем таблицы:

SELECT t.name 
     ,SCHEMA_NAME(t.schema_id) AS [schema_name] 
     ,c.name 
     ,c.definition 
FROM sys.computed_columns c 
     JOIN sys.tables t ON t.object_id = c.object_id; 

Я думаю, что это потребует некоторых проб и ошибок, чтобы получить правильный код, но вы должны быть в состоянии построить контрольный скрипт для проверки текущей формулы и активируйте DROP/CREATE только при необходимости.

Возможная проблема: если устаревшая версия сценария запущена, она может вернуть формулу к предыдущей версии, чтобы была выполнена проверка метки времени.

0

Если вы не против использования жесткого кода (не хорошо), этот скрипт может помочь. Вам придется использовать hardcoded column_id или лучше выяснить способ его получения (подсчет столбцов для этой таблицы может быть?).

CREATE TABLE dbo.Table_1(ID int identity(0, 1), V1 int NULL, V2 int NULL, V3 AS V1*V2) ON [PRIMARY] 

select top 10 * from sys.computed_columns where OBJECT_ID('table_1') = object_id 

If Exists(Select 1 From sys.computed_columns where OBJECT_ID('table_1') = object_id and name = 'v3' and column_id<= 
4) 
Begin 
    Print 'Update Computed Column' 
    Alter TAble Table_1 Drop column V3; 
    Alter Table Table_1 Add V3 as V1*V2 
End 
Else 
Begin 
    Print 'No Update' 
End 

select top 10 * from sys.computed_columns where OBJECT_ID('table_1') = object_id 
Смежные вопросы