表:插入和更新多少行

时间:2019-04-10 02:39:06

标签: sql-server transactions sql-server-2016

如何查找表中插入的行数以及最近更新的行数?今天我们有一个数据仓库存储过程,该过程更新了一个表。 我不在乎哪一行,而只是每笔交易的计数(插入/更新)。我们的数据库没有CDC /或CT。有没有办法查询Sys DMV或日志?我继承了旧代码,因此将来会添加手动日志记录,只是想知道SQL Server是否在任何地方都可以自动记录日志。

2 个答案:

答案 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