【问题标题】:Creating stored procedure that returns the row count only创建仅返回行数的存储过程
【发布时间】:2021-02-06 04:18:24
【问题描述】:

我想查询一个表并获取适合给定查询的总行数:

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 返回 5783 行,但返回值为 5781。我原以为记录总数会与返回值匹配。

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

谢谢!

【问题讨论】:

  • ` SELECT @@ROWCOUNT` 将构成1 row。执行完存储过程后你是否又执行了一次`SELECT @@ROWCOUNT`?

标签: sql sql-server stored-procedures sql-server-2016


【解决方案1】:

我同意 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。如果是字符串,则使用字符串。
  • 如果使用直接日期比较,日期算术是可搜索的(即对优化器更好)。
  • 为每一列重复整个表名只会使代码难以编写和阅读。使用表别名!

【讨论】:

  • 完美! Tyvm 的信息,这是一个很大的帮助!
【解决方案2】:

如果你想继续使用存储过程,只需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

【讨论】:

  • tyvm 为您提供帮助!
【解决方案3】:

我不知道您的存储过程的确切问题是什么,但您可以尝试使用标量值函数来返回行数。请检查我的代码并尝试一下,让人们知道。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多