【问题标题】:How can I alter this computed column in SQL Server 2008?如何在 SQL Server 2008 中更改此计算列?
【发布时间】:2022-01-11 17:10:22
【问题描述】:

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

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

非常感谢!

【问题讨论】:

  • 什么不起作用?你有错误吗?它没有做你所期望的吗?如果是这样,你期待什么

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


【解决方案1】:

另一件可能对某人有帮助的事情是如何修改作为表中计算列的函数(以下查询适用于 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 会自动填充计算列,因此删除和添加不会影响数据(我不知道这一点)

【讨论】:

    【解决方案2】:

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

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

    在 SSMS 中这样做会保留表中列的顺序,而简单的drop...add 无法保证这一点。这对某些人来说可能很重要。

    【讨论】:

    • 这是一个有用的解决方案。我想证明当处理非常大的表时,数百万到数十亿行,这将导致表重建。这可能需要几个小时才能执行,具体取决于表的宽度和存储的数据类型(例如,MAX)。为了避免表重建,有必要删除和添加;前提是对表的所有 SQL 查询都不是使用特定字段顺序的查询完成的(即 INSERT INTO,没有字段名称)
    【解决方案3】:

    类似这样的:

    ALTER TABLE dbo.MyTable
    DROP COLUMN OldComputedColumn
    
    ALTER TABLE dbo.MyTable
    ADD OldComputedColumn AS OtherColumn + 10
    

    Source

    【讨论】:

      【解决方案4】:

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

      更改表 tbPedidos 将列限制更改为 (演员(当restricaoLicenca = 1或restricaoLote = 1或restricaoValor = 1时的情况 然后 1 否则 0 以位结束))

      编辑:以上内容不正确。在更改 computed 列时,您唯一可以做的就是删除它并重新添加它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-07
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多