当值变为0时触发Sql Server数据库存储过程

时间:2015-07-19 01:28:11

标签: sql-server stored-procedures triggers

我的一个表中有一列用作倒计时。因此,当当前日期时间接近结束时间时,它会向下移动到0.一旦达到结束时间,倒计时的值就变为0。发生这种情况时,我希望它能触发存储过程。有谁知道如何创建这样的触发器?

表:

CREATE TABLE t1 (
id int IDENTITY,
enddate datetime NOT NULL,
daysleft AS (DATEDIFF(dd, GETDATE(), enddate))
);

INSERT INTO t1 (enddate)
VALUES(DATEADD(dd, 1, GETDATE())),
(DATEADD(dd, 2, GETDATE())),
(DATEADD(dd, 15, GETDATE()))

我还没有创建程序,只是因为如果我无法创建所需的触发器就没用了。

1 个答案:

答案 0 :(得分:0)

我不认为SQL Server中有一个构造允许您在数据值等于用户定义值时运行存储过程。这背后的原因是如果要做出类似的事情,SQL Server的性能将受到极大的影响。

我建议您考虑编写一个定期唤醒的Windows服务,并检查表中是否有任何已过期的行,然后在它们上调用您预期的存储过程。如果你愿意,我可以给你一个如何实现这个目标的样本。

编辑:Windows服务的示例实现

好的,正如我上面所说,当特定数据达到其到期时间时,无法通知。因此,我们不是在推送通知模型中,而是在拉动通知模型中工作,我们定期在数据库中查询过期行(例如"SELECT id FROM t1 WHERE enddate = @todayDate"

现在,此解决方案的关键部分是我们需要定期服务。这已在另一位用户的回答here中得到证明。我们将执行SQL操作的方法是private void timer_Elapsed(...)

private void timer_Elapsed(object sender, System.Timer.ElapsedEventArgs e)
{
    // since I am not sure whether you are accessing your database using ADO.NET 
    // (i.e. SqlConnection, etc.) or Entity Framework (i.e. DbContext), 
    // I will assume ADO.NET from here on

    // retrieve all rows that have expired
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();

        var command = new SqlCommand("SELECT id FROM t1 WHERE enddate = @todayDate", connection);
        var paramDate = new SqlParameter("@todayDate", DateTime.Now.Date);
        command.Parameters.Add(paramDate);
        var reader = command.ExecuteReader();

        while (reader.Read()) 
        {
            var storedProcCommand = new SqlCommand("EXEC CleanUpExpiredRow @id", connection);
            var paramId = new SqlParameter("@id", reader.GetInt32(0));
            storedProcCommand.Parameters.Add(paramId);
            command.ExecuteNonQuery();
        }
    }
}

注意此代码均未经过测试。