如何查找表中插入的行数以及最近更新的行数?今天我们有一个数据仓库存储过程,它更新了一个表。 我不关心哪些行,只关心每个事务的计数(插入/和更新)。我们的数据库没有 CDC/或 CT。有没有办法查询 Sys DMV 或日志?我正在继承遗留代码,因此将来会添加手动日志记录,只是好奇 SQL Server 是否在任何地方都有此自动日志记录。
这可能对您有帮助,我们可以通过两种方式实现这一目标。
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
如果您可以将类型为
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
) (你的下一个起点)。