【问题标题】:Use computed column or stored procedure使用计算列或存储过程
【发布时间】:2012-12-17 00:37:06
【问题描述】:

我有一张表,其中有几列用作datetime 邮票。该表包含以下列

UpDate      datetime
SearchDate  datetime
ExpDate     dateadd(hour,24,UpDate)
Active      nvarchar(5)

UpDate 列通过每日导入更新时,计算列ExpDate 将随着时间 + 24 小时更新。我希望Active 列在当前日期时间小于ExpDate 时指示'Y',在当前日期时间等于或大于ExpDate 时指示'N'

我想只使用存储过程无限期地运行以检查并根据需要进行更新,但这没有意义,我想知道是否有人对如何执行此操作有任何其他建议。例如,如果我也可以基于 IF 语句查询将其用作计算列。

【问题讨论】:

    标签: sql-server-2008 tsql datetime stored-procedures calculated-columns


    【解决方案1】:

    除非您有充分的理由坚持计算 ExpDateActive,否则我认为您应该在查询中针对您的表进行计算。

    类似这样的:

    select [UpDate],
           SearchDate,
           dateadd(hour, 24, SearchDate) as ExpDate,
           case when getdate() >= dateadd(hour, 24, SearchDate)
             then 'N' 
             else 'Y' 
           end as Active
    from YourTable
    

    如果您想要计算列,您的 DDL 应如下所示:

    create table YourTable
    (
      [UpDate] datetime,
      SearchDate datetime,
      ExpDate as dateadd(hour, 24, SearchDate),
      Active as case when getdate() >= dateadd(hour, 24, SearchDate)
                  then 'N' 
                  else 'Y' 
                end
    )
    

    【讨论】:

    • 感谢您的回复。如果我理解正确,您的意思是当我在表中查询我想要的 ExpDate 尚未到达的记录时,然后设置 Active = Y 并将所有其他设置为 N?
    • 我的意思是您在执行查询时同时计算 ExpDate 和 Active。不存储任何地方或更新任何内容,只是将值返回给您的客户端以用于当前执行的查询。
    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    相关资源
    最近更新 更多