我在存储的Prod中有一个参数,它以格式获取一些数据。
1/1/2018-2/1/2018,2/1/2018-3/1/2018,3/1/2018-4/1/2018,4/1/2018-5/1/2018,5/1/2018-6/1/2018,6/1/2018-7/1/2018,7/1/2018-8/1/2018,8/1/2018-9/1/2018,9/1/2018-10/1/2018,
10/1/2018-11/1/2018,11/1/2018-12/1/2018,12/1/2018-12/31/2018我有一个函数,它根据数据、字符并将其存储在一个表变量中,如下所示
declare @SPlitDates table(ItemNumber int,Item nvarchar(max))
insert into @SPlitDates
select * from dbo.SPlitFunction(@RequestData, ',')之后,我必须对数据范围执行某些操作,所以我使用游标循环遍历临时表,如下所示
DECLARE cur CURSOR FOR SELECT Item FROM @SPlitDates order by ItemNumber
OPEN cur
FETCH NEXT FROM cur INTO @monthStart
WHILE @@FETCH_STATUS = 0 BEGIN
--Some operation
End我将在临时表中得到的最大数据点是12个月的日期范围。
我的问题是,除了游标之外,我还可以使用其他东西来提高性能,或者当数据集真的这么小的时候,这并不重要。
谢谢
发布于 2019-03-28 04:21:33
如果可能,只需将其视为一个集合,并考虑是否可以将--Some operation重写为一个批处理。
它可能要求您根据日期范围对其他表进行联接,或者在执行可能有助于联接的附加处理之前,将日期范围进一步拆分为StartDate和EndDate列。
发布于 2019-07-23 17:54:07
行数越多,光标对您的影响就越大。如果你从来没有处理过很多行,游标是可以的。但是,如果您正在处理大量的行,否则您将沿着这条路前进,那么您应该探索基于集合的代码。我肯定这是不完全正确的,因为我没有所有的信息,但比较以下两个粗略的例子:
DECLARE cur CURSOR FOR SELECT Item FROM @SPlitDates order by ItemNumber
OPEN cur
FETCH NEXT FROM cur INTO @monthStart
WHILE @@FETCH_STATUS = 0 BEGIN
--Some operation
FETCH NEXT FROM cur INTO @monthStart -- next item
End
-- housekeeping
CLOSE cur
DEALLOCATE cur
--This would be close to a set-based operation of that cursor--
Insert @monthStart(Item)
SELECT Item
--CASE EXPRESSION(s)--
FROM @SPlitDates
order by ItemNumberhttps://dba.stackexchange.com/questions/233300
复制相似问题