Как получить количество строк, вставленных транзакцией - PullRequest
42 голосов
/ 16 февраля 2010

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

Ответы [ 4 ]

94 голосов
/ 16 февраля 2010

@@ 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 @Rows=@@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 @Rows=@@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 @AppleTotal=@AppleTotal+@@ROWCOUNT

INSERT INTO Apple (col1, col2) Select col1,col2 from abc where ...
SET @AppleTotal=@AppleTotal+@@ROWCOUNT

INSERT INTO Peach (col1, col2) Select col1,col2 from xyz where ...
SET @PeachTotal=@PeachTotal+@@ROWCOUNT

INSERT INTO Peach (col1, col2) Select col1,col2 from abc where ...
SET @PeachTotal=@PeachTotal+@@ROWCOUNT

COMMIT

SELECT @AppleTotal AS AppleTotal, @PeachTotal AS PeachTotal
5 голосов
/ 18 апреля 2013

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

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

DECLARE @InsertedIDs table(ID int);

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

НТН

2 голосов
/ 01 августа 2013

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

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
0 голосов
/ 25 марта 2019

Вы можете использовать @@trancount в MSSQL

Из документации :

Возвращает количество операторов BEGIN TRANSACTION, которые произошли в текущем соединении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...