【问题标题】:How to get number of rows inserted by a transaction如何获取事务插入的行数
【发布时间】:2010-02-16 12:11:14
【问题描述】:

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

【问题讨论】:

    标签: sql-server sql-server-2005


    【解决方案1】:

    @@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 等,您需要确定您希望如何“计算”正在发生的事情。您可以为每个表设置单独的总计、单个总计值或完全不同的值。您需要为要跟踪的每个总数声明一个变量,并在适用于它的每个操作之后添加到它:

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

    【讨论】:

    • 我没有使用SELECT @Rows=@@ROWCOUNT,而是尝试了SET @Rows=@@ROWCOUNT,但仍然收到相同的结果。谢谢你,好帖子!
    • 仅供参考:Even 将我的 INSERT 语句包装在 Transaction 块语句中会导致 @@RowCount 被重置,因此我必须在调用 Commit 之前设置 @Rows 变量!跨度>
    • @MikeTeeVee 通过使用SELECT,您可以在单个语句中进行多个分配,因此您可以轻松添加SELECT @Rows=@@ROWCOUNT, @ID=SCOPE_IDENTITY(), @Error=@@ERROR。 SET 只能设置一个值。 TRY CATCH 消除了捕获@@ERROR 的需要,但我仍然使用SELECT。
    • @MikeTeeVee,您必须在您感兴趣的命令之后立即捕获@@ROWCOUNT,因为它是在每个命令之后设置的,甚至是COMMIT,甚至是您的SET @Rows=@@ROWCOUNT。例如,如果您更新 4 行然后提交,您的 @@ROWCOUNT 将在 UPDATE 之后为 4,但在 COMMIT 之后将为零。这就是在局部变量中捕获@@ROWCOUNT 的原因。
    • 我试过这个方法。它在 Management Studio 上运行良好,但是当我尝试在我的代码中执行相同的查询时,它总是返回 0 用于 rows 和 1 用于 rowcount。我不确定是否有哪里出错了
    【解决方案2】:

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

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

    DECLARE @InsertedIDs table(ID int);
    
    INSERT INTO YourTable
        OUTPUT INSERTED.ID
            INTO @InsertedIDs 
        SELECT ...
    

    HTH

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案4】:

        您可以在 MSSQL 中使用@@trancount

        来自documentation:

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

        【讨论】:

          猜你喜欢
          • 2013-08-05
          • 2019-09-13
          • 1970-01-01
          • 1970-01-01
          • 2012-11-27
          • 1970-01-01
          • 1970-01-01
          • 2013-07-01
          • 2015-03-01
          相关资源
          最近更新 更多