我有一个使用以下行创建的计算列:
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语句中输入另一个条件,但它不起作用。
非常感谢!
答案 0 :(得分:64)
这样的事情:
ALTER TABLE dbo.MyTable
DROP COLUMN OldComputedColumn
ALTER TABLE dbo.MyTable
ADD OldComputedColumn AS OtherColumn + 10
答案 1 :(得分:62)
如果您尝试更改现有列,则无法使用ADD。相反,试试这个:
<击> 改变表tbPedidos 将列限制为 (演员(当limitaoLicenca = 1或者limitaoLote = 1或者limitaoValor = 1时的情况) 然后1其他0结束位)) 击>
编辑:以上不正确。更改计算列时,您可以做的唯一事情就是删除它并重新添加。
答案 2 :(得分:3)
这是使用SQL Server Management Studio的diagram功能可以更轻松,更快捷的情况之一。
('')
或同样无关紧要的内容(可能是您不会更改列的数据类型)。在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)
注意:
参数可以是表中的其他列
您可能无法一次运行所有这些查询,对此我遇到了麻烦。一次运行一次
答案 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