【发布时间】:2020-04-17 19:19:08
【问题描述】:
我编写了这个 SQL Server 存储过程,它根据客户在另一个表中的订购频率将记录插入到另一个表中。它根据每个客户的订单频率为他们分配一个排名。当我第一次创建过程并执行它时,它工作正常并将正确的记录插入到表中。但是当我清除表并尝试再次执行该过程时,没有添加任何记录。我必须删除该过程,重新启动 SSMS,然后再次创建该过程,它才能再次正常工作。
程序如下:
create procedure TopKCustomer (@CustRank decimal(11,0))
as
declare CustCursor cursor local for
select o.CustomerID,c.CustomerName,c.CustomerPostalCode,
count(o.CustomerID) as 'Order Frequency'
from (Customer_T c join Order_T o on c.CustomerID=o.CustomerID)
group by o.CustomerID,c.CustomerName,c.CustomerPostalCode
order by [Order Frequency] desc;
declare @PrevOrderFreq float;
declare @CurrOrderFreq float;
declare @CurrRank decimal(11,0);
declare @CurrCustID decimal(11,0);
declare @CurrCustName varchar(25);
declare @CurrCustPostCode varchar(10);
begin
set @PrevOrderFreq = 0;
set @CurrOrderFreq = 0;
set @CurrRank = 0;
set @CurrCustID = 0;
set @CurrCustName = '';
set @CurrCustPostCode = '';
open CustCursor;
while @@FETCH_STATUS = 0
begin
fetch next from CustCursor into @CurrCustID, @CurrCustName, @CurrCustPostCode, @CurrOrderFreq;
if @CurrOrderFreq <> @PrevOrderFreq
begin
set @CurrRank = (@CurrRank + 1);
if @CurrRank > @CustRank
begin
break;
end
end
insert into TopKCustomer_T
values (@CurrCustID, @CurrCustName, @CurrCustPostCode, @CurrRank, getdate());
set @PrevOrderFreq = @CurrOrderFreq;
end
close CustCursor;
deallocate CustCursor;
end
这是我正在使用的表格:
- Customer_T (CustomerID, CustomerName, CustomerAddress, CustomerCity, CustomerState, CustomerPostalCode)
- Order_T(OrderID、CustomerID、OrderDate)
- TopKCustomer(CustomerID、CustomerName、CustomerPostalCode、CRank、RankGenerateDate)
【问题讨论】:
-
哇....光标。为什么??? SQL 是一种基于集合的语言。您不会一个一个地循环每个记录。
-
是光标造成的问题吗?
-
你可以谷歌一下。这不是循环记录的正确方法。
-
@user10605996 答案之一是否解决了您的问题?如果是,请考虑接受。
标签: sql-server stored-procedures