Таблицы: сколько строк вставлено и обновлено - PullRequest
4 голосов
/ 10 апреля 2019

Как узнать количество строк, вставленных в таблицу, и количество недавно обновленных строк? Сегодня у нас была хранимая процедура хранилища данных, которая обновляла таблицу. Мне все равно, какие строки, только количество (вставлено / обновлено) от каждой транзакции. В нашей базе данных нет CDC / или CT. Есть ли способ запросить Sys DMV или журналы? Я наследую унаследованный код, поэтому добавлю ручную регистрацию в будущем, просто любопытно, будет ли эта запись где-либо автоматически регистрироваться в SQL Server.

Ответы [ 2 ]

3 голосов
/ 13 апреля 2019

Это может помочь вам. Мы можем достичь этого двумя способами.1. OUTPUT Clause : Возвращает информацию или выражения, основанные на каждой строке, затронутой оператором INSERT, UPDATE, DELETE или MERGE.Эти результаты могут быть возвращены приложению обработки для использования в таких вещах, как подтверждающие сообщения, архивирование и другие подобные требования приложения.Результаты также могут быть вставлены в таблицу или переменную таблицы.Кроме того, вы можете зафиксировать результаты предложения OUTPUT во вложенном операторе INSERT, UPDATE, DELETE или MERGE и вставить эти результаты в целевую таблицу или представление.2. @@rowcount : Возвращает количество строк, затронутых последним оператором.Если количество строк превышает 2 миллиарда, используйте 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
0 голосов
/ 17 апреля 2019

Если вы можете добавить столбец типа 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) вашей БД (ваша следующая начальная точка).

...