创建仅 returns 行计数的存储过程

Creating stored procedure that returns the row count only

我想查询 table 并获取符合给定查询的总行数:

ALTER PROCEDURE [dbo].[GetTransactionsFromTransactionRecordForMonthYear]
    @Guid   nvarchar(50),
    @Month  int,
    @Year   int
AS
BEGIN
    SET NOCOUNT ON; 

    SELECT  *
    FROM    Company.TransactionRecord
    WHERE   Company.TransactionRecord.CorporationId = @Guid and 
    MONTH( Company.TransactionRecord.TransactionDate ) = @Month AND 
    YEAR( Company.TransactionRecord.TransactionDate ) = @Year
    SELECT @@ROWCOUNT
END

当我 运行 这个时,SSMS return 返回 5783 行但是 return 值是 5781。我本以为记录总数会匹配 return值。

我不确定我做错了什么。我该如何解决这个问题,它只是 return 该查询的记录总数?

谢谢!

我不知道你的存储过程到底有什么问题,但你可以尝试使用标量值函数来计算 return 行数。请检查我的代码并尝试并让男人知道。

ALTER FUNCTION [dbo].[GetTransactionsFromTransactionRecordForMonthYear]
(
    @Guid  nvarchar(50),
    @Month int,
    @Year  int
)
RETURNS INT
AS
BEGIN    
  DECLARE @Value INT
  
  SET @Value=(SELECT  COUNT(*)
              FROM Company.TransactionRecord
              WHERE Company.TransactionRecord.CorporationId = @Guid and 
              MONTH( Company.TransactionRecord.TransactionDate ) = @Month AND 
              YEAR(Company.TransactionRecord.TransactionDate ) = @Year);
  RETURN @Value;
END

我同意 Linker 的观点,即标量值函数是更好的方法。我只是认为提议的代码一团糟,也应该清理一下:

ALTER FUNCTION [dbo].GetTransactionsFromTransactionRecordForMonthYear
(
    @Guid  uniqueidentifer,
    @Month int,
    @Year  int
)
RETURNS INT
AS
BEGIN    
    DECLARE @row_count INT;
  
    SELECT @row_count = COUNT(*)
    FROM Company.TransactionRecord tr
    WHERE tr.CorporationId = @Guid AND
          tr.TransactionDate >= DATEFROMPARTS(@Year, @Month, 1) AND
          tr.TransactionDate < DATEADD(MONTH, 1, DATEFROMPARTS(@Year, @Month, 1));

    RETURN @row_count;
END;

备注:

  • SQL 具有唯一标识符的类型。据推测,这就是您的 GUID。如果是字符串,就用字符串。
  • 如果使用直接日期比较,日期算法是可搜索的(即对优化器更好)。
  • 为每一列重复整个 table 名称只会使代码难以编写和阅读。使用 table 个别名!

如果要继续使用存储过程,只需select count(*)而不是select *:

 CREATE OR ALTER PROCEDURE [dbo].[GetTransactionsFromTransactionRecordForMonthYear]
    @Guid   nvarchar(50),
    @Month  int,
    @Year   int
AS
BEGIN
    SET NOCOUNT ON; 

    SELECT  count(*) rows
    FROM  Company.TransactionRecord tr
    WHERE tr.CorporationId = @Guid  
      AND tr.TransactionDate >= datefromparts(@year,@month,1)
      AND tr.TransactionDate < dateadd(month,1,datefromparts(@year,@month,1))

END