Мне нужно управлять журналом, где я должен видеть количество строк, которые вставляются транзакцией. Есть ли способ сделать это динамически?
Как получить количество строк, вставленных транзакцией
Ответ 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