如何在SQL Server 2008中更改此计算列?

时间:2010-03-03 15:44:48

标签: sql sql-server-2008 edit alter calculated-columns

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

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语句中输入另一个条件,但它不起作用。

非常感谢!

5 个答案:

答案 0 :(得分:64)

这样的事情:

ALTER TABLE dbo.MyTable
DROP COLUMN OldComputedColumn

ALTER TABLE dbo.MyTable
ADD OldComputedColumn AS OtherColumn + 10

Source

答案 1 :(得分:62)

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

<击>     改变表tbPedidos     将列限制为     (演员(当limitaoLicenca = 1或者limitaoLote = 1或者limitaoValor = 1时的情况)         然后1其他0结束位))

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

答案 2 :(得分:3)

这是使用SQL Server Management Studio的diagram功能可以更轻松,更快捷的情况之一。

  1. 创建新图表,添加表格,然后选择在图表的表格视图中显示公式列。
  2. 将列公式更改为空字符串('')或同样无关紧要的内容(可能是您不会更改列的数据类型)。
  3. 保存图表(应保存表格)。
  4. 改变你的功能。
  5. 将该函数放回该列的公式中。
  6. 再次保存。
  7. 在SSMS中这样做会保留表格中列的顺序,简单drop...add无法保证。这对某些人来说可能很重要。

答案 3 :(得分: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自动填充计算出的列,因此删除和添加不会影响数据(我不知道这一点)

答案 4 :(得分:-3)

正如Michael Todd在his answer

中正确陈述的那样
  

更改计算列时,您唯一能做的就是删除它   并重新添加它。

我必须自己做,尽管我想保留现有数据(正如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