【发布时间】:2026-01-15 16:15:02
【问题描述】:
我有一个存储过程,用于检查将在接下来的 90、60、30、21、14 和 7 天内过期的卡。当我在 SQL Server 中执行存储过程时,我得到了所有的行,但是当我从代码中调用相同的存储过程时,它只返回第一行而不循环整个结果集。
这就是我检索结果的方式:
CREATE PROCEDURE [dbo].[GetExpiringCards]
AS
DECLARE @today datetime2 = CAST(GETDATE() AS date)
DECLARE @INTERVALS TABLE (intval int)
INSERT INTO @INTERVALS (intval) VALUES (90)
INSERT INTO @INTERVALS (intval) VALUES (60)
INSERT INTO @INTERVALS (intval) VALUES (30)
INSERT INTO @INTERVALS (intval) VALUES (21)
INSERT INTO @INTERVALS (intval) VALUES (7)
INSERT INTO @INTERVALS (intval) VALUES (14)
DECLARE @value int
DECLARE db_cursor CURSOR FOR
SELECT intval FROM @INTERVALS
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @value
WHILE @@FETCH_STATUS = 0
BEGIN
SET NOCOUNT ON;
SELECT
@value AS Interval, DATEADD(DD, @value, @today) AS ExpiresOn,
CustomerId, IssueBranch
FROM
Cards
WHERE
ExpiryDate = CONVERT(DATE, DATEADD(DAY, @value, GETDATE()))
FETCH NEXT FROM db_cursor INTO @value
END
CLOSE db_cursor
DEALLOCATE db_cursor
GO
在我调用的代码中:
using (SqlConnection conn = new SqlConnection(DatabaseConnect2))
{
SqlCommand cmd = new SqlCommand("GetExpiringCards", conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Customer customer = new Customer ();
customer.Interval = Convert.ToInt32(dr["Interval"]);
customer.ExpiresOn = Convert.ToDateTime(dr["ExpiresOn"]);
customer.CustomerId = Convert.ToString(dr["CustomerId"]);
customer.IssueBranch = Convert.ToString(dr["IssueBranch"]);
customer.Add(upload);
}
conn.Close();
}
当我在 SSMS 中执行存储过程时,我得到以下信息:
我尝试过如下更改逻辑,但是一旦获取第一行,流程就会立即循环出去:
using (SqlConnection conn = new SqlConnection(DatabaseConnect2))
{
SqlCommand cmd = new SqlCommand("GetExpiringCards", conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read() && dr.HasRows)
{
Customer customer = new Customer ();
customer.Interval = Convert.ToInt32(dr["Interval"]);
customer.ExpiresOn = Convert.ToDateTime(dr["ExpiresOn"]);
customer.CustomerId = Convert.ToString(dr["CustomerId"]);
customer.IssueBranch = Convert.ToString(dr["IssueBranch"]);
customer.Add(upload);
}
conn.Close();
}
我错过了什么?
【问题讨论】:
-
您的过程正在返回多个结果集,但您的读者只会使用此代码读取第一个结果。更新 proc 以返回单个结果集怎么样?
标签: sql-server stored-procedures