C# 在SQLServer2005中,列在确定的时间后如何更改其值

C# 在SQLServer2005中,列在确定的时间后如何更改其值,c#,sql,sql-server,database,sql-server-2005,C#,Sql,Sql Server,Database,Sql Server 2005,我有一个带有列(id、标题、内容、publishingDateTime、状态)的表(tblMessage)。publishingDateTime列是消息发布的日期。我想在到达其publishingDateTime时自动将列(status)的值从(pending to published-或-从false更改为true) 在Sql Server 2005中如何实现这一点?最简单的方法可能是根本不更改该值。相反,使用计算列,逻辑如下: status as (case when publishingD

我有一个带有列(id、标题、内容、publishingDateTime、状态)的表(tblMessage)。publishingDateTime列是消息发布的日期。我想在到达其publishingDateTime时自动将列(status)的值从(pending to published-或-从false更改为true)


在Sql Server 2005中如何实现这一点?

最简单的方法可能是根本不更改该值。相反,使用计算列,逻辑如下:

status as (case when publishingDateTime > getdate() then 'Published' else 'Pending' end)
这在
create table
语句中进行了说明

您还可以通过创建一个视图并通过一个视图对表进行所有访问来执行类似的操作(通常是一个好主意)

例如,create table语句如下所示:

create table xxx (
    -- all your columns go here
    status as (case when publishingDateTime > getdate() then 'Published' else 'Pending' end)
)
对于视图,您可以执行以下操作:

create view vw_SMS as
    select sms.*, 
           (case when publishingDateTime > getdate() then 'Published' else 'Pending'
            end) as status
    from SMS

实际上,最好不要在视图中使用
*
,而是列出所有列。

最简单的方法可能是根本不更改值。相反,使用计算列,逻辑如下:

status as (case when publishingDateTime > getdate() then 'Published' else 'Pending' end)
这在
create table
语句中进行了说明

您还可以通过创建一个视图并通过一个视图对表进行所有访问来执行类似的操作(通常是一个好主意)

例如,create table语句如下所示:

create table xxx (
    -- all your columns go here
    status as (case when publishingDateTime > getdate() then 'Published' else 'Pending' end)
)
对于视图,您可以执行以下操作:

create view vw_SMS as
    select sms.*, 
           (case when publishingDateTime > getdate() then 'Published' else 'Pending'
            end) as status
    from SMS

实际上更好的做法是不要在视图中使用
*
,而是列出所有列。

通常应用程序应该这样做

但如果您只是想让sql server像这样

UPDATE tblMessage
SET status = 0
WHERE publishingDateTime <= GETDATE()
更新TBL消息
设置状态=0

如果publishingDateTime那么通常您的应用程序应该这样做

但如果您只是想让sql server像这样

UPDATE tblMessage
SET status = 0
WHERE publishingDateTime <= GETDATE()
更新TBL消息
设置状态=0

其中publishingDateTime可以创建一个Transact-SQL作业,该作业将执行一个存储过程,该存储过程将根据发布日期更新状态列

请参阅此处的文档:


您可以创建一个Transact-SQL作业,该作业将执行一个存储过程,该存储过程将根据发布日期更新状态列

请参阅此处的文档:


您的意思是需要定时执行此更新吗?@Kelley。。。当然可以。你是说你需要定时执行此更新吗?@Kelley。。。是的,当然+1个人来说,我喜欢带有额外列的视图的想法。是的,当您始终可以确定表中的值在运行时应该是什么时,应该不需要不断修改表中的值。我可能会在computed列之前选择view选项,除非该列将在大多数查询中被引用(在这种情况下,我会尝试确保它是确定性的,然后持久化并可能对其进行索引)。@Gordon Linoff……这是我的表创建脚本,我可以在其中放置上述代码<代码>创建表[dbo]。[SMS]([id][int]不为NULL,[message][nvarchar](50)将SQL\u Latin1\u General\u CP1\u CI\u整理为NULL,[publishingDateTime][datetime]NULL,[status][nvarchar](50)将SQL\u Latin1\u General\u CP1\u CI\u整理为NULL,将[PK_SMS]主键群集化([id]ASC)与[PRIMARY]上的(忽略重复键=OFF)进行比较
@Gordon Linoff。。。您创建的代码是否可以在不创建作业或计划的情况下一直工作?@Gordon Linoff。。。我尝试过的代码,但它提到了一条消息……**Msg 156,级别15,状态1,第5行关键字“as”附近的语法不正确。就我个人而言,我喜欢带有额外列的视图的想法。是的,当您始终可以确定表中的值在运行时应该是什么时,应该不需要不断修改表中的值。我可能会在computed列之前选择view选项,除非该列将在大多数查询中被引用(在这种情况下,我会尝试确保它是确定性的,然后持久化并可能对其进行索引)。@Gordon Linoff……这是我的表创建脚本,我可以在其中放置上述代码<代码>创建表[dbo]。[SMS]([id][int]不为NULL,[message][nvarchar](50)将SQL\u Latin1\u General\u CP1\u CI\u整理为NULL,[publishingDateTime][datetime]NULL,[status][nvarchar](50)将SQL\u Latin1\u General\u CP1\u CI\u整理为NULL,将[PK_SMS]主键群集化([id]ASC)与[PRIMARY]上的(忽略重复键=OFF)进行比较
@Gordon Linoff。。。您创建的代码是否可以在不创建作业或计划的情况下一直工作?@Gordon Linoff。。。我尝试过的代码,但它提到了一条消息……**Msg 156,级别15,状态1,第5行关键字“as”附近的语法不正确**