68

我有一个使用以下行创建的计算列:

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

4 回答 4

94

像这样的东西:

ALTER TABLE dbo.MyTable
DROP COLUMN OldComputedColumn

ALTER TABLE dbo.MyTable
ADD OldComputedColumn AS OtherColumn + 10

来源

于 2012-10-01T19:52:08.047 回答
79

如果您尝试更改现有列,则不能使用 ADD。相反,试试这个:

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))

编辑:以上是不正确的。更改计算列时,您唯一能做的就是删除它并重新添加它。

于 2010-03-03T15:49:48.287 回答
4

这是仅使用SQL Server Management Studio的图表功能可以更轻松、更快速的情况之一。

  1. 创建一个新图表,添加您的表格,然后选择在图表的表格视图中显示公式列。
  2. 将列公式更改为空字符串('')或同样无害的内容(可能这样您就不会更改列的数据类型)。
  3. 保存图表(应该保存表格)。
  4. 改变你的功能。
  5. 将函数放回该列的公式中。
  6. 再保存一次。

在 SSMS 中以这种方式执行此操作将保留表中列的顺序,这drop...add不能保证简单。这对某些人来说可能很重要。

于 2016-03-24T19:51:30.390 回答
0

可能对某人有帮助的另一件事是如何修改作为表中计算列的函数(以下查询适用于 SQL):

ALTER <table>
DROP COLUMN <column>

ALTER FUNCTION <function>
(
<parameters>
)
RETURNS <type>
BEGIN
...
END

ALTER <table>
ADD <column> as dbo.<function>(parameters)

笔记:

  1. 参数可以是表中的其他列

  2. 您可能无法一次运行所有这些查询,我遇到了麻烦。一次运行一个

  3. SQL 自动填充计算列,因此删除和添加不会影响数据(我不知道这一点)
于 2019-11-15T17:49:40.817 回答