我的一个表中有一列用作倒计时。因此,当当前日期时间接近结束时间时,它会向下移动到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()))
我还没有创建程序,只是因为如果我无法创建所需的触发器就没用了。
答案 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();
}
}
}
注意此代码均未经过测试。