#sql #sql-server #datatable
Вопрос:
У меня есть вычисляемый столбец, созданный со следующей строкой:
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, но это не работает.
Большое спасибо!
Комментарии:
1. Что не работает? Вы получаете сообщение об ошибке? Разве это не делает того, чего вы ожидаете? Если да, то чего вы ожидаете?
Ответ №1:
Что-то вроде этого:
ALTER TABLE dbo.MyTable
DROP COLUMN OldComputedColumn
ALTER TABLE dbo.MyTable
ADD OldComputedColumn AS OtherColumn 10
Ответ №2:
Если вы пытаетесь изменить существующий столбец, вы не можете использовать команду ДОБАВИТЬ. Вместо этого попробуйте это:
изменить таблицу tbPedidos изменить ограничения столбца как (приведение(случай, когда restrictaolicenca = 1 или restrictaolote = 1 или restrictaovalor = 1, тогда 1 еще 0 заканчивается как бит))
ПРАВКА: Вышесказанное неверно. При изменении вычисляемого столбца единственное, что вы можете сделать,-это удалить его и добавить заново.
Ответ №3:
Это одна из тех ситуаций, когда может быть проще и быстрее просто использовать функцию диаграммы в среде SQL Server Management Studio.
- Создайте новую диаграмму, добавьте свою таблицу и выберите отображение столбца формулы в табличном представлении диаграммы.
- Измените формулу столбцов на пустую строку
('')
или что-то столь же безобидное (возможно, такое, что вы не измените тип данных столбца). - Сохраните диаграмму (которая должна сохранить таблицу).
- Измените свою функцию.
- Верните функцию в формулу для этого столбца.
- Спасите еще раз.
Выполнение этого таким образом в SSMS сохранит порядок столбцов в вашей таблице, что простое drop...add
не гарантирует. Для некоторых это может быть важно.
Комментарии:
1. Это полезное решение. Я хочу уточнить, что при работе с очень большими таблицами, от миллионов до миллиардов строк, это приведет к перестройке таблицы. Это может занять несколько часов, в зависимости от ширины таблицы и типов хранимых данных (например, МАКСИМУМ). Чтобы избежать перестройки таблицы, необходимо удалить и добавить; при условии, что все SQL-запросы к таблице не выполняются с запросами, для которых определен точный порядок полей (т. Е. ВСТАВИТЬ В, без имен полей)
Ответ №4:
Еще одна вещь, которая может быть кому-то полезна, — это как изменить функцию, которая является вычисляемым столбцом в таблице (следующий запрос предназначен для SQL).:
ALTER <table>
DROP COLUMN <column>
ALTER FUNCTION <function>
(
<parameters>
)
RETURNS <type>
BEGIN
...
END
ALTER <table>
ADD <column> as dbo.<function>(parameters)
Примечания:
- Параметрами могут быть другие столбцы из таблицы
- Возможно, вы не сможете выполнить все эти запросы сразу, у меня были проблемы с этим. Запускайте их по одному за раз
- SQL автоматически заполняет вычисляемые столбцы, поэтому удаление и добавление не повлияют на данные (я об этом не знал).