SQL SERVER存储过程里取到一个list,如何在存储过程里再循环读取

gongjie416 2012-10-26 09:28:42
存储过程

select roomid from room_info 先是取到所有roomid,
然后我想在接下中,根据每个roomid循环更新或者删除其他数据,
想请教 如何在存储过程里得到每一个roomid
...全文
549 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
汤姆克鲁斯 2012-10-26
  • 打赏
  • 举报
回复
-->连续聚合
-->测试数据:[groups]
--SELECT [groupid],[ordmonth],[val] FROM [groups]
DECLARE @result TABLE ([groupid] VARCHAR(1),[ordmonth] DATETIME,[val] INT,[runval] INT)
DECLARE @groupid VARCHAR(1),@prvgroupid VARCHAR(1),@ordmonth DATETIME,@val INT,@runval INT

DECLARE c CURSOR FAST_FORWARD
FOR
SELECT [groupid],[ordmonth],[val] FROM [groups] ORDER BY [groupid],[ordmonth]
OPEN c
FETCH NEXT FROM c INTO @groupid,@ordmonth,@val
SELECT @prvgroupid=@groupid,@runval=0
WHILE @@fetch_status = 0
BEGIN
IF @groupid<>@prvgroupid
BEGIN
SELECT @prvgroupid=@groupid,@runval=0
END
SET @runval=@runval+@val
INSERT INTO @result VALUES(@prvgroupid,@ordmonth,@val,@runval)
FETCH NEXT FROM c INTO @groupid,@ordmonth,@val
END
CLOSE c
DEALLOCATE c

SELECT [groupid],[ordmonth],[val],[runval]FROM @result ORDER BY [groupid],[ordmonth]
汤姆克鲁斯 2012-10-26
  • 打赏
  • 举报
回复
-->分组的聚合乘积
--> 测试数据:[groups]
IF OBJECT_ID('[groups]') IS NOT NULL DROP TABLE [groups]
GO
CREATE TABLE [groups]([groupid] VARCHAR(1),ordmonth DATETIME,[val] INT)
INSERT [groups]
SELECT 'a','2012-01-01',3 UNION ALL
SELECT 'a','2012-02-01',1 UNION ALL
SELECT 'a','2012-03-01',8 UNION ALL
SELECT 'a','2012-04-01',10 UNION ALL
SELECT 'a','2012-05-01',15 UNION ALL
SELECT 'b','2012-01-01',1 UNION ALL
SELECT 'b','2012-02-01',2 UNION ALL
SELECT 'b','2012-03-01',3 UNION ALL
SELECT 'b','2012-04-01',20 UNION ALL
SELECT 'b','2012-05-01',10 UNION ALL
SELECT 'c','2012-01-01',10 UNION ALL
SELECT 'c','2012-02-01',12 UNION ALL
SELECT 'c','2012-03-01',13 UNION ALL
SELECT 'c','2012-04-01',14 UNION ALL
SELECT 'c','2012-04-01',3 UNION ALL
SELECT 'c','2012-05-01',20
GO

--> 测试语句:
DECLARE @result TABLE ([groupid] VARCHAR(1),[product] BIGINT)
DECLARE @groupid VARCHAR(1),@val INT,@prvgroupid VARCHAR(1),@product BIGINT

DECLARE c CURSOR FAST_FORWARD
FOR
SELECT [groupid],[val] FROM [groups] ORDER BY [groupid]
OPEN c
FETCH NEXT FROM c INTO @groupid, @val
SELECT @prvgroupid=@groupid,@product=1
WHILE @@fetch_status = 0
BEGIN
IF @groupid<>@prvgroupid
BEGIN
INSERT INTO @result VALUES(@prvgroupid,@product)
SELECT @prvgroupid=@groupid,@product=1
END
SET @product=@product*@val
FETCH NEXT FROM c INTO @groupid, @val
END
IF @prvgroupid IS NOT NULL
INSERT INTO @result VALUES(@prvgroupid,@product)
CLOSE c
DEALLOCATE c

SELECT [groupid],[product] FROM @result

--方法二
--这个方法看似很简洁,语法精炼,但是如果,在数据中出现
SELECT [groupid],EXP(SUM(LOG([val]))) FROM [groups]
GROUP BY [groupid]

gongjie416 2012-10-26
  • 打赏
  • 举报
回复
没用过游标呀,有没有例子借鉴下
發糞塗牆 2012-10-26
  • 打赏
  • 举报
回复
如果你的roomid没有什么顺序可言,那可以加个自增ID,比如2005以后使用row_number()来自增,然后按这个id循环一个一个处理。
spiritofdragon 2012-10-26
  • 打赏
  • 举报
回复
用游标,在SQL帮助里搜下 cursor

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧