如何获取事务插入的行数

时间:2010-02-16 12:11:15

标签: sql-server sql-server-2005

我必须管理一个日志,我必须看到事务插入的行数。有没有办法动态地做到这一点?

4 个答案:

答案 0 :(得分:92)

@@ ROWCOUNT将给出受 last SQL语句影响的行数,最好按照相关命令将其捕获到局部变量中,因为它的值将在下次更改你看看它:

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等,您需要确定如何“计算”正在发生的事情。每张表可以有一个单独的总计,一个总的总价值,或者完全不同的东西。您需要为每个要跟踪的总数DECLARE变量,并在每个适用于它的操作后添加到该变量:

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

答案 1 :(得分:5)

如果您需要有关日志/审核的更多信息,可以使用OUTPUT子句: 这样,您不仅可以保持受影响的行数,还可以记录哪些记录。

作为插入期间输出子句的示例: SQL Server list of insert identities

DECLARE @InsertedIDs table(ID int);

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

HTH

答案 2 :(得分:2)

我找到了上一篇文章的答案。在这里。

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

答案 3 :(得分:-1)

您可以在MSSQL中使用@@trancount

来自documentation

  

返回当前连接上发生的BEGIN TRANSACTION语句的数量。