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

Sql 如何创建从另一列计算的列?,sql,sql-server-2008,Sql,Sql Server 2008,我需要在SQL Server数据库中创建一列age 应根据列DOB的值计算此列的值 它的值也应该随着年龄的增加而增加。您应该使用计算列来解决这个问题。定义与此类似的东西: ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate()) 原始声明摘自,更多信息请访问 编辑: MSDN将计算列解释为: 计算列是从可以使用其他 同一表中的列。表达式可以是非计算列 名称、常量、函数以及通过 一个或多个操作员。表达式不能是子查询 除非另有规

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

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


它的值也应该随着年龄的增加而增加。

您应该使用计算列来解决这个问题。定义与此类似的东西:

ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate())
原始声明摘自,更多信息请访问

编辑:

MSDN将计算列解释为:

计算列是从可以使用其他 同一表中的列。表达式可以是非计算列 名称、常量、函数以及通过 一个或多个操作员。表达式不能是子查询

除非另有规定,否则计算列是 未实际存储在表中。它们的值将重新计算 每次在查询中引用它们时。数据库引擎使用 CREATE TABLE和ALTER TABLE语句中的持久化关键字 在表中物理存储计算列。他们的价值观是 当计算中的任何列发生更改时更新。通过 将计算列标记为持久化,可以在 确定但不精确的计算列。另外,, 如果计算列引用CLR函数,则数据库引擎 无法验证函数是否真正具有确定性。在这个 在这种情况下,必须持久化计算列,以便可以创建索引 在上面创建。有关详细信息,请参见在计算机上创建索引 列

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

必须标记用作CHECK、外键或NOTNULL约束的计算列 坚持。计算列可以用作索引中的键列,也可以用作任何索引的一部分 主键或唯一约束(如果计算列值由 索引中允许确定性表达式和结果的数据类型 列

例如,如果表具有整数列a和b,则计算列a+b可以是 已编制索引,但计算列a+DATEPART(dd,GETDATE())无法编制索引,因为 值可能在后续调用中更改>

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

数据库引擎会自动确定 基于使用的表达式计算列。大多数的结果 即使只有不可为空的列,表达式也被视为可为空 存在,因为可能会产生下溢或溢流 空结果也是如此。将COLUMNPROPERTY函数与 AllowsNull属性以调查任何计算 表中的列。可以将可为null的表达式转换为 通过指定ISNULL(检查_表达式,常量)不可为空, 其中,常数是一个非空值,用于替换任何空结果


来源:

这是获得年龄的正确方法:

alter table <yourtable> add age as datediff(year, DOB, getdate())- case when month(DOB)*32 + day(DOB) > month(getdate()) * 32 + day(getdate()) then 1 else 0 end
alter table将年龄添加为datediff(year,DOB,getdate())-如果月份(DOB)*32+天(DOB)>月份(getdate())*32+天(getdate()),则1结束
代码片段

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

使用自动生成的列创建表

CREATE TABLE Person2
(Id int IDENTITY(1,1) NOT NULL, Name nvarchar(50),
DOB date, Age AS DATEDIFF(YEAR, DOB ,GETDATE()) )

那么新添加的行呢?只有当您选择表的值时,或者更确切地说,当您访问任何人都会知道年龄是否为最新时,才可以。因此,您可以使用触发器/存储过程来执行此操作。。不是吗?我只需在表的顶部创建一个视图,视图定义的最后一列为
datediff(yy,DOB,getUTCDate())
。创建一个计算年龄的视图。没有必要存储此类信息。哦,看,一个家庭作业问题:-)我建议你也在这里添加一些信息,而不仅仅是链接。就像什么是计算列一样,这可以被验证,可以被索引,等等。我冒昧地引用了MSDNvery很好的描述,但它确实找不到年龄。它发现了两个日期之间的全年差异。DOB='2012-12-31',getdate()='2013-01-01'=1年