Как изменить этот вычисляемый столбец в SQL Server 2008?

у меня есть вычисляемый столбец, созданный со следующей строкой:

alter table tbPedidos 
add restricoes as (cast(case when restricaoLicenca = 1 or restricaoLote = 1 then 1 else 0 end as bit))

но теперь мне нужно изменить этот столбец для чего-то вроде:

alter table tbPedidos 
alter column restricoes as (cast(case when restricaoLicenca = 1 or restricaoLote = 1 or restricaoValor = 1 then 1 else 0 end as bit))

но это не работает. Я пытаюсь ввести другое условие в оператор case, но оно не работает.

Спасибо большое!

4 ответов


Если вы пытаетесь изменить существующий столбец, вы не можете использовать ADD. Вместо этого, попробуйте следующее:

изменить таблицу tbPedidos изменить restricoes столбца (cast (случай, когда restricaoLicenca = 1 или restricaoLote = 1 или restricaoValor = 1 тогда 1 иначе 0 конец как бит))

EDIT: выше это неправильно. При изменении вычисляемые единственное, что вы can do отбрасывает его и повторно добавляет его.


что-то вроде этого:

ALTER TABLE dbo.MyTable
DROP COLUMN OldComputedColumn

ALTER TABLE dbo.MyTable
ADD OldComputedColumn AS OtherColumn + 10

источник


Это одна из тех ситуаций, когда может быть проще и быстрее просто использовать - схемы функция среды SQL Server Management Studio.

  1. создайте новую диаграмму, добавьте таблицу и выберите отображение столбца формулы в табличном представлении диаграммы.
  2. измените формулу столбцов на пустую строку ('') или что-то столь же безобидное (возможно, такое, что вы не изменяете тип данных столбца).
  3. сохранить диаграмму (которая должна сохранить таблицу).
  4. измените свою функцию.
  5. поместите функцию обратно в формулу для этого столбца.
  6. сохранить еще раз.

делать это таким образом в SSMS сохранит порядок столбцов в вашей таблице, который простой drop...add не гарантирует. Это может быть важно для некоторых.


Как Майкл Тодд правильно говорится в ответ

при изменении вычисляемого столбца единственное, что вы можете сделать, это бросить его и добавь еще раз.

просто должен был сделать это сам, хотя я хотел сохранить существующие данные (как это делает Management Studio, когда вы выполняете эту задачу через конструктор).

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

SELECT IDKey, Value
INTO #Temp
FROM MyTable

ALTER TABLE MyTable
DROP COLUMN Value

ALTER TABLE MyTable
ADD Value nvarchar(max) NULL

UPDATE MyTable
SET Value = #Temp.Value
FROM
MyTable
INNER JOIN #Temp ON #Temp.IDKey= MyTable.IDkey