无意间了解到MSSQL的游标,知道了一种情况下需要使用游标。举例如下:
一、情况1
有两张表:表A、表B,关系为 表A 1——>* 表B
如果要求查出和表A数据列一一对应的所有表B的数据列时,这个时候就需要使用游标来查询。
伪代码:
1 var tempitem=new List<TableBItem>();//用于存储查询出的所有表B的数据列 2 3 var parmarykeylist=new List<int>(); 4 5 parmarykeylist=TableA.GetParmaryKeyList();//获取表A的主键List。 6 7 foreach(var k in parmarykeylist)//根据表A的主键查询所有该组键对应的表B的Item 8 9 { 10 11 tempitem.Add(TableB.Where(b=>b.tableAParmaryKey==k).ToList()); 12 13 } 14 return tempitem;
相对于mssql中:
第三行代码相当于创建游标
第五行相当于为游标循环填充循环数据
PS:其实此种情况也可以通过 APPLY运算符来实现,关于APPLY在SQLServer 2005帮助中的讲解如下:
使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。
APPLY 有两种形式: CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
SELECT *
FROM TableA AS A
CROSS APPLY fn_getBbyA(A.primaryID) AS B
其中:
fn_getBbyA()为表值函数
如有问题,请多多指教。