Как изменить этот вычисляемый столбец в 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.
- создайте новую диаграмму, добавьте таблицу и выберите отображение столбца формулы в табличном представлении диаграммы.
- измените формулу столбцов на пустую строку
('')
или что-то столь же безобидное (возможно, такое, что вы не изменяете тип данных столбца). - сохранить диаграмму (которая должна сохранить таблицу).
- измените свою функцию.
- поместите функцию обратно в формулу для этого столбца.
- сохранить еще раз.
делать это таким образом в 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