如何将sql计数结果与以前的结果值进行比较-自上次选择计数以来有多少新记录

时间:2019-04-09 21:36:34

标签: sql sql-server tsql sql-server-2014

我有一个在表上插入新值的脚本。当我select count(*)时显示结果。当我重复查询时,有没有办法将此值与新值进行比较?

考虑到脚本仍在插入新值,我想知道自上次选择计数以来有多少新记录。

3 个答案:

答案 0 :(得分:2)

您不能轻易做到这一点,因为每次运行查询(如果手动运行)时,都会重置您拥有的所有变量。我可以想到3种选择:

1)与Gordon的代码类似,但是每次运行时都必须手动保存该值

declare @saved_count int = 0; -- THIS MUST BE MANUALLY UPDATED EACH TIME YOU RUN IT

-- Get the different since the last run
select count(*)-@saved_count
from MyTable;

-- Get the current value => manually copy to @saved_count above
select count(*)
from MyTable;

2)根据Lukasz的回答,将值存储在更永久的存储中(您可以使用全局临时表,一旦断开连接,该表将不受影响,而不会影响生产。)

3)您可以按以下方式运行自动查询,该查询可跟踪当前值并定期为您打印一些详细信息。

declare @CurrentCount int = 0, @LastCount int = 0;

while 1 = 1 begin
  select @CurrentCount = count(*)
  from MyTable;

  select getdate(), @CurrentCount - @LastCount;
  raiserror('Force a buffer flush',0,1) with nowait;

  set @LastCount = @CurrentCount;

  waitfor delay '00:00:10'; -- Wait 10s
end

答案 1 :(得分:1)

您可以实现它:

CREATE TABLE tab_stat(id INT IDENTITY(1,1), t DATETIME DEFAULT GETDATE(), cnt BIGINT);

INSERT INTO tab_stat(cnt)
SELECT COUNT(*)
FROM tab_name;

SELECT *, cnt - LAG(cnt,1,0) OVER(ORDER BY id) AS diff
FROM tab_stat
ORDER BY id DESC;

db<>fiddle demo

答案 2 :(得分:0)

通常,您不能执行此操作。但是,如果表中有一个标识列,您可以记住它,然后执行以下操作:

select count(*)
from t
where id > @saved_id;

您可以对创建日期/时间执行类似的操作。

当然,您必须将最大ID(或创建时间)分配给变量,以使其下次工作。