Подтвердить что ты не робот

Как получить количество строк, вставленных транзакцией

Мне нужно управлять журналом, где я должен видеть количество строк, которые вставляются транзакцией. Есть ли способ сделать это динамически?

4b9b3361

Ответ 1

@@ROWCOUNT будет указывать количество строк, влияющих на оператор SQL last, лучше всего записать его в локальную переменную, следуя соответствующей команде, так как ее значение изменится в следующий раз вы смотрите на него:

DECLARE @Rows int
DECLARE @TestTable table (col1 int, col2 int)
INSERT INTO @TestTable (col1, col2) select 1,2 union select 3,4
SELECT @[email protected]@ROWCOUNT
SELECT @Rows AS Rows,@@ROWCOUNT AS [ROWCOUNT]

ВЫВОД:

(2 row(s) affected)
Rows        ROWCOUNT
----------- -----------
2           1

(1 row(s) affected)

вы получаете значение Rows 2, количество вставленных строк, но ROWCOUNT равно 1, потому что команда SELECT @[email protected]@ROWCOUNT затронула 1 строку

если у вас есть несколько INSERT или UPDATE и т.д. в вашей транзакции, вам нужно определить, как вы хотите "подсчитать", что происходит. У вас может быть отдельная сумма для каждой таблицы, одно большое общее значение или что-то совершенно другое. Вам необходимо ОБНАРУЖИТЬ переменную для каждой общей суммы, которую вы хотите отслеживать и добавить к ней, после каждой операции, которая применяется к ней:

--note there is no error handling here, as this is a simple example
DECLARE @AppleTotal  int
DECLARE @PeachTotal  int

SELECT @AppleTotal=0,@PeachTotal=0

BEGIN TRANSACTION

INSERT INTO Apple (col1, col2) Select col1,col2 from xyz where ...
SET @[email protected][email protected]@ROWCOUNT

INSERT INTO Apple (col1, col2) Select col1,col2 from abc where ...
SET @[email protected][email protected]@ROWCOUNT

INSERT INTO Peach (col1, col2) Select col1,col2 from xyz where ...
SET @[email protected][email protected]@ROWCOUNT

INSERT INTO Peach (col1, col2) Select col1,col2 from abc where ...
SET @[email protected][email protected]@ROWCOUNT

COMMIT

SELECT @AppleTotal AS AppleTotal, @PeachTotal AS PeachTotal

Ответ 2

Если вам нужна дополнительная информация для вашего журнала/аудита, вы можете использовать пункт OUTPUT: Таким образом, вы не только сохраняете количество затронутых строк, но и какие записи.

В качестве примера выходного предложения во вставках: SQL Server список идентификаторов вставки

DECLARE @InsertedIDs table(ID int);

INSERT INTO YourTable
    OUTPUT INSERTED.ID
        INTO @InsertedIDs 
    SELECT ...

НТН

Ответ 3

Я нашел ответ на предыдущий пост. Вот оно.

CREATE TABLE #TempTable (id int) 

INSERT INTO @TestTable (col1, col2) OUTPUT INSERTED.id INTO #TempTable select 1,2 

INSERT INTO @TestTable (col1, col2) OUTPUT INSERTED.id INTO #TempTable select 3,4 

SELECT * FROM #TempTable --this select will chage @@ROWCOUNT value