首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用游标遍历Server中的表变量

使用游标遍历Server中的表变量
EN

Database Administration用户
提问于 2019-03-27 18:47:06
回答 2查看 7.6K关注 0票数 0

我在存储的Prod中有一个参数,它以格式获取一些数据。

代码语言:javascript
运行
复制
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

我有一个函数,它根据数据、字符并将其存储在一个表变量中,如下所示

代码语言:javascript
运行
复制
declare @SPlitDates table(ItemNumber int,Item nvarchar(max))
insert into @SPlitDates
select * from dbo.SPlitFunction(@RequestData, ',')

之后,我必须对数据范围执行某些操作,所以我使用游标循环遍历临时表,如下所示

代码语言:javascript
运行
复制
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个月的日期范围。

我的问题是,除了游标之外,我还可以使用其他东西来提高性能,或者当数据集真的这么小的时候,这并不重要。

谢谢

EN

回答 2

Database Administration用户

发布于 2019-03-28 04:21:33

如果可能,只需将其视为一个集合,并考虑是否可以将--Some operation重写为一个批处理。

它可能要求您根据日期范围对其他表进行联接,或者在执行可能有助于联接的附加处理之前,将日期范围进一步拆分为StartDate和EndDate列。

票数 2
EN

Database Administration用户

发布于 2019-07-23 17:54:07

行数越多,光标对您的影响就越大。如果你从来没有处理过很多行,游标是可以的。但是,如果您正在处理大量的行,否则您将沿着这条路前进,那么您应该探索基于集合的代码。我肯定这是不完全正确的,因为我没有所有的信息,但比较以下两个粗略的例子:

代码语言:javascript
运行
复制
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 ItemNumber
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/233300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档