有没有类似Oracle里面for in loop的语句?就是对记录集进行遍历,但是不用游标

aquariusdeng 2008-10-10 03:05:59
Oracle里面有一个
for c in select a,b from c loop
//此处可以使用 c.a, c.b 等等
end loop

这样用比游标的好处是不用再定义若干个变量供fetch into

因为我要操作的记录集还有字段比较多,要是用fetch cursor into @a, @b, @c,.....//这里可能要几百个变量了

SQL Server有类似上面说的Oracle的功能吗?谢谢
...全文
1123 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-10-10
  • 打赏
  • 举报
回复
1
游标
2
临时表或表变量的identity列做记录指针,用循环来实现。
3
一些简单功能可以用递规查询变量实现,比如;
declare @s varchar(max)
select @s=isnull(@s+',','') + value from table
实现value值的拼接。 当然也可在此基础上扩展。
4
一些特定的功能,可由xml实现,利用xpath和xflow实现遍历功能
zzuyongp 2008-10-10
  • 打赏
  • 举报
回复
while
tianhuo_soft 2008-10-10
  • 打赏
  • 举报
回复
循环
aquariusdeng 2008-10-10
  • 打赏
  • 举报
回复
我不是只拷贝数据,中间还有别的操作

Anyway,thanks
hsie168518 2008-10-10
  • 打赏
  • 举报
回复


[就算你只用游标代表ID,要得到id代表的数据,你是再查一遍库?查完出来的数据要使用的话,要不要再用个变量? ]

我一般只用游标拷贝数据,就是把一个表中的数据拷到另一个表,新表和老表就是ID不同。

可以多定义几个变量,标识清楚一点就没关系了。
aquariusdeng 2008-10-10
  • 打赏
  • 举报
回复
to:hsie168518
就当只有两三个
for c in select a,b from d loop
//此处可以使用 c.a, c.b 等等
end loop
请问你在循环里面要使用a或b的你不要定义变量来代表它?
就算你只用游标代表ID,要得到id代表的数据,你是再查一遍库?查完出来的数据要使用的话,要不要再用个变量?

hsie168518 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aquariusdeng 的回复:]
十几个表每个表几十个字段
加起来几百个字段有什么奇怪

难道只能用cursor了?

还是oracle方便啊
[/Quote]

你不会每个字段用一个变量吧,一般用一个变量取到ID在就得到这条数据了
hsie168518 2008-10-10
  • 打赏
  • 举报
回复


一条条数据访问本来就要用游标的。


  --把合符条件的目标权限Id加载到一个临时表变量中
DECLARE @tbTargetPermissions table(IndexId int IDENTITY (0, 1) NOT NULL PRIMARY KEY, TargetPermissionId uniqueidentifier NOT NULL)
INSERT INTO @tbTargetPermissions
SELECT [TargetPermissionId]
FROM [ps_RolePermissions]
WHERE [TargetId] = @TargetId AND [RoleId] = @RoleId

DECLARE @MaxIndexId int;
SELECT @MaxIndexId = MAX([IndexId]) FROM @tbTargetPermissions; --计算最大记录序号,用于遍历列表

WHILE @MaxIndexId > -1
BEGIN
DECLARE @TargetPermissionId uniqueidentifier;
SELECT @TargetPermissionId = [TargetPermissionId] FROM @tbTargetPermissions WHERE [IndexId] = @MaxIndexId;

EXEC ps_TargetPermissionEntity_Select @TargetPermissionId;

--删除最大记录项,重新判断记录项是否大于-1,以此判断是否遍历完列表
DELETE @tbTargetPermissions WHERE [IndexId] = @MaxIndexId;
SELECT @MaxIndexId = MAX([IndexId]) FROM @tbTargetPermissions
--SELECT @MaxIndexId--测试(倒序)
END


这个给你参考,不过变量也很多
aquariusdeng 2008-10-10
  • 打赏
  • 举报
回复
十几个表每个表几十个字段
加起来几百个字段有什么奇怪

难道只能用cursor了?

还是oracle方便啊
dobear_0922 2008-10-10
  • 打赏
  • 举报
回复
除游标外,没有类似的功能
rucypli 2008-10-10
  • 打赏
  • 举报
回复
难道你有几百个字段吗
aquariusdeng 2008-10-10
  • 打赏
  • 举报
回复
能说详细点儿吗?
while就可以不用定义那么多变量?
liangCK 2008-10-10
  • 打赏
  • 举报
回复
WHILE

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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