如何使用select查询截断并向表中添加新行永远不会得到空结果

时间:2015-03-17 01:22:41

标签: sql sql-server sql-server-2005

我有一个要求,其中表格保存某些事物的状态。 此表被截断,每秒插入新的状态数据。 问题是如果在删除和下面的插入之间执行选择查询,则用户将获得空表。 SQL Transactions在这里没有帮助我想但不确定。 此外,如果在删除和插入查询之间执行select查询,则它不应该返回错误,因为它被数据库锁定阻止。它应该等到delete + insert操作完成。

实施此类系统的最佳方式是什么? 我应该如何形成"删除+插入"查询和"选择"查询?

提前谢谢。

--------其他信息 此表将是多次重度查询的结果,并且将每秒更新一次,以便应用程序不会运行那些繁重的查询,而是从这个表中获取所需的信息。 所以截断并随机插入每一秒和多个选择。

2 个答案:

答案 0 :(得分:1)

不要截断表格。而是使用标识主键或日期作为主键插入新状态。然后做:

select top 1 date
from table
order by date desc

select max(date)
from table

(这些应该具有基本相同的执行计划。)

然后,您插入新日期。插入完成后,数据立即可用。

然后,您可以随意删除旧行。

答案 1 :(得分:0)

根据您的描述,此表始终只包含一行,即最后一次状态更改。内容每秒钟都在变化,显然是每天24小时。

不是用截断/插入操作对更改数据,为什么不只更新一行?一次操作,没有竞争条件,根本没有锁定冲突。

甚至可以在不更改任何现有代码的情况下执行此操作:

  • 重命名表格
  • 创建一个显示重命名表中的行的视图。将其命名为原始表名。
  • 在视图上创建“而不是插入”触发器。触发器执行表的更新而不是插入。这可以使用merge语句执行,如果表应该是空的,那么它将起作用。
哎呀,我错了。您仍然需要更改代码以删除truncate语句。它不会对视图起作用,但会引发异常。不幸的是,你不能用触发器拦截截断,而只是忽略它。

然后,当执行插入时,不再需要截断,并且插入转换为更新(或合并)。一个操作。