创建仅 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
我想查询 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