如何获取事务插入的行数

Hot*_*ter 44 sql-server sql-server-2005

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

KM.*_*KM. 99

@@ ROWCOUNT将给出受上一个 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]
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

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

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

你得到的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
Run Code Online (Sandbox Code Playgroud)

  • 我没有使用`SELECT @Rows = @@ ROWCOUNT`,而是尝试了`SET @Rows = @@ ROWCOUNT`,但仍然收到了相同的结果.谢谢,好帖子! (2认同)
  • @MikeTeeVee,你必须在你感兴趣的命令之后立即捕获`@@ ROWCOUNT`,因为它是在每个命令之后设置的,甚至是`COMMIT`,甚至你的`SET @Rows = @@ ROWCOUNT`.例如,如果你更新4行然后提交,你的`@@ ROWCOUNT`将在'UPDATE'之后为4,但在`COMMIT`之后将为零.这就是在局部变量中捕获`@@ ROWCOUNT`的原因. (2认同)

小智 5

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

作为插入期间输出子句的示例: 插入标识的SQL Server列表

DECLARE @InsertedIDs table(ID int);

INSERT INTO YourTable
    OUTPUT INSERTED.ID
        INTO @InsertedIDs 
    SELECT ...
Run Code Online (Sandbox Code Playgroud)

HTH