首页 > 解决方案 > 存储过程选择语句中受影响的 SQL Server 日志记录行

问题描述

我有一个日志表,其中写入与调用某些仅包含选择语句的存储过程相关的各种信息。其中一个信息是存储的程序返回的行数。

一种方法是:

  1. 运行相对于最终选择指令的计数
  2. 在日志表中插入信息
  3. 执行最终选择指令

有没有办法在不进行双重查询(第一个带有计数,第二个带有选择)的情况下恢复行受影响的信息?

提前致谢

标签: sql-serverloggingstored-proceduresrow-number

解决方案


您应该能够使用@@ROWCOUNT来获取受执行的最后一条语句影响的行数。

请参阅:https ://docs.microsoft.com/en-us/sql/t-sql/functions/rowcount-transact-sql?view=sql-server-ver15

根据您的评论,这是一个包含示例的编辑,其中 select 语句仍然是存储过程的输出。对日志表的插入是在 select 语句之后,因此该@@ROWCOUNT命令仍然有效,同时仍然提供实际查询结果作为输出。

DROP TABLE IF EXISTS ##LOG

CREATE TABLE ##Log
(
    ProcName NVARCHAR(100)
    ,ExecutionTime DATETIME
    ,TotalRowsReturned INT
)

GO

CREATE PROCEDURE TestProc
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @numRows INT = RAND()*(50-5)+5;

    SELECT TOP (@numRows) *
    FROM sys.objects

    INSERT INTO ##Log
    (
        ProcName,
        ExecutionTime,
        TotalRowsReturned
    )
    SELECT
        OBJECT_NAME(@@PROCID)
        ,GETDATE()
        ,@@ROWCOUNT

    SET NOCOUNT OFF
END

GO


EXEC TestProc
GO 5

SELECT * FROM ##Log

推荐阅读