表:插入和更新了多少行

问题描述 投票:0回答:2

如何查找表中插入的行数以及最近更新的行数?今天我们有一个数据仓库存储过程,它更新了一个表。 我不关心哪些行,只关心每个事务的计数(插入/和更新)。我们的数据库没有 CDC/或 CT。有没有办法查询 Sys DMV 或日志?我正在继承遗留代码,因此将来会添加手动日志记录,只是好奇 SQL Server 是否在任何地方都有此自动日志记录。

sql-server transactions sql-server-2016
2个回答
5
投票

这可能对您有帮助,我们可以通过两种方式实现这一目标。

1. OUTPUT Clause :
返回受 INSERT、UPDATE、DELETE 或 MERGE 语句影响的每一行的信息或基于该行的表达式。这些结果可以返回到处理应用程序,以用于确认消息、归档和其他此类应用程序需求。结果还可以插入到表或表变量中。此外,您可以捕获嵌套 INSERT、UPDATE、DELETE 或 MERGE 语句中 OUTPUT 子句的结果,并将这些结果插入到目标表或视图中。

2. @@rowcount :
返回受最后一条语句影响的行数。如果行数超过20亿,则使用ROWCOUNT_BIG。

CREATE TABLE TEMPS
(
    ID INT,
    ENTRY_DT DATETIME,
    BIRTH_DT DATETIME,
    NAMES VARCHAR (25)
)
/*----------------------1. Get Inserted & Updated record using @@ROWCOUNT-------------------------------- */
declare @rowcnt int

INSERT INTO TEMPS 
VALUES ('123', '6/10/2015', '2/6/2018', 'JOHN'),
       ('123', '2/4/2018', '2/6/2018', 'SMITH'),
       ('123', '2/4/2018', '2/6/2018', 'DOE')
set @rowcnt = @@rowcount
update temps
set Names ='rima'
where temps.Names = 'SMITH'

set @rowcnt = @rowcnt+@@rowcount

select @rowcnt "total_rows_affected"



/* ----------------------2. Get Inserted record count using Output Clause-------------------------------- */
DECLARE @MyTableVar_Inserted table( Inserted_Cnt int );  

INSERT INTO TEMPS 
output inserted.ID
Into   @MyTableVar_Inserted
VALUES ('123', '6/10/2015', '2/6/2018', 'JOHN'),
       ('123', '2/4/2018', '2/6/2018', 'SMITH'),
       ('123', '2/4/2018', '2/6/2018', 'DOE')
             
select * from temps
select count(*) from  @MyTableVar_Inserted



/* ----------------------Get Updated record count using Output Clause-------------------------------- */
DECLARE @MyTableVar_Updated table( Updated_Cnt int );  

update temps
set Names ='rima'
OUTPUT  INSERTED.ID       cnt 
INTO @MyTableVar_Updated 
where temps.Names = 'SMITH'

select count(Updated_Cnt) from @MyTableVar_Updated

0
投票

如果您可以将类型为

rowversion
(又名
timestamp
)的列添加到要监视的表中,并保留
bigint
数据以及您检查的最后更改(插入/更新),则可以使用存储过程如:

CREATE Proc CountChanges(@PrevTs bigint) as
declare @sql nvarchar(MAX)=''
set nocount on
select @sql += case when @sql='' then '' else ' union all ' end
    +'select COUNT(*) Qt,MAX(convert(bigint,' + COLUMN_NAME + ')) LC from ' + TABLE_NAME
    +' where convert(bigint,'+COLUMN_NAME+')>' + cast(@PrevTs as nvarchar(20))
from INFORMATION_SCHEMA.COLUMNS
where DATA_TYPE = 'timestamp'
set @sql = 'select ' + cast(@PrevTs as nvarchar(20))
         + ' FromTs,SUM(Qt) Qty,MAX(LC) LastTs,convert(bigint,@@DBTS) DBTs from ('
         + @sql + ') q'
exec (@sql)

它返回类似:

| FromTs |   Qty |  LastTs |    DBTs |
+--------+-------+---------+---------+
| 369912 | 23302 | 3813009 | 3817000 |

您之前的起点 (

FromTs
)、插入/更新数量 (
Qty
)、表中最后的 rowversion (
LastTs
) 以及数据库当前使用的最高 rowversion (
DBTs
) (你的下一个起点)。

© www.soinside.com 2019 - 2024. All rights reserved.