如何创建从另一列计算的列?

Uda*_*ani 4 sql sql-server-2008

我需要age在SQL Server数据库中创建一个列.

应根据列的值计算此列的值DOB.

它的值也应该随着Age增加而增加.

Sch*_*zIT 9

您应该使用计算列来解决此问题.具有与此类似的定义的东西:

ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate())
Run Code Online (Sandbox Code Playgroud)

BlackWasp提供的原始声明和更多信息.

编辑:

MSDN将计算列解释为:

计算列是根据可以使用同一表中其他列的表达式计算的.表达式可以是非计算列名,常量,函数以及由一个或多个运算符连接的任何组合.表达式不能是子查询.

除非另行指定,否则计算列是未物理存储在表中的虚拟列.每次在查询中引用它们时,都会重新计算它们的值.数据库引擎使用CREATE TABLE和ALTER TABLE语句中的PERSISTED关键字在表中物理存储计算列.当计算中的任何列发生更改时,它们的值会更新.通过将计算列标记为PERSISTED,您可以在计算列上创建一个确定性但不精确的索引.此外,如果计算列引用CLR函数,则数据库引擎无法验证该函数是否真正具有确定性.在这种情况下,计算列必须为PERSISTED,以便可以在其上创建索引.有关更多信息,请参阅在计算列上创建索引.

可以在选择列表,WHERE子句,ORDER BY子句或可以使用正则表达式的任何其他位置中使用计算列,但以下情况除外:

用作CHECK,FOREIGN KEY或NOT NULL约束的计算列必须标记为PERSISTED.如果计算列值由确定性表达式定义并且索引列中允许结果的数据类型,则计算列可用作索引中的键列或作为任何PRIMARY KEY或UNIQUE约束的一部分.

例如,如果表具有整数列a和b,则可以对计算列a + b建立索引,但是计算列a + DATEPART(dd,GETDATE())不能被索引,因为该值可能在后续调用中更改>.

计算列不能是INSERT或UPDATE语句的目标.

数据库引擎根据使用的表达式自动确定计算列的可为空性.即使只存在不可存在的列,大多数表达式的结果也被认为是可空的,因为可能的下溢或溢出也会产生空结果.使用带有AllowNull属性的COLUMNPROPERTY函数来调查表中任何计算列的可为空性.通过指定ISNULL(check_expression,constant),可以将可为空的表达式转换为不可为空的表达式,其中常量是替换任何空结果的非空值.

来源:MSDN - 计算列


小智 5

代码片段

ALTER TABLE
    TheTable
ADD
    DOB AS
    CASE
        WHEN
                MONTH(Birth) > MONTH(ISNULL(Death, SYSDATETIME()))
            OR  (
                        MONTH(Birth) = MONTH(ISNULL(Death, SYSDATETIME()))
                    AND DAY(Birth) >= DAY(ISNULL(Death, SYSDATETIME()))
                )
        THEN
            DATEDIFF(YEAR, Birth, ISNULL(Death, SYSDATETIME())) - 1
        ELSE
            DATEDIFF(YEAR, Birth, ISNULL(Death, SYSDATETIME()))
    END
Run Code Online (Sandbox Code Playgroud)