如何查找表中插入的行数以及最近更新的行数?今天我们有一个数据仓库存储过程,该过程更新了一个表。 我不在乎哪一行,而只是每笔交易的计数(插入/更新)。我们的数据库没有CDC /或CT。有没有办法查询Sys DMV或日志?我继承了旧代码,因此将来会添加手动日志记录,只是想知道SQL Server是否在任何地方都可以自动记录日志。
答案 0 :(得分:2)
这可能会对您有所帮助,我们可以通过两种方式实现这一目标。
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 Caluse-------------------------------- */
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 Caluse-------------------------------- */
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
答案 1 :(得分: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
),表中最后一个行版本(LastTs
)以及最高数据库(您的下一个起点)当前正在使用(DBTs
的 rowversion 。