日期:2014-05-16  浏览次数:20454 次

sqlserver 遍历表 都有哪些方法
如果想对表的每行记录进行一个操作,就需要用到表遍历。

除了游标,表变量,临时表,还有其他的方法吗?


------解决方案--------------------
引用:
如果想对表的每行记录进行一个操作,就需要用到表遍历。

除了游标,表变量,临时表,还有其他的方法吗?


sql server 中最重要的查询概念就是数据集。针对每行记录的操作,实际上可以视为对每行数据集的处理。 
lz 可以使用迭代的写法,也可以通过分析处理的方法,进行函数处理。

这个要看具体需求。

------解决方案--------------------

;WITH  info(InfoID,InfoTitle,ClassID) 
AS
(
select 1,'中国合伙人',7 union all 
select 2,'致青春',7 union all 
select 3,'雷神2', 4 union all 
select 4,'狼少年',4 union all 
select 5,'天天向上',5 union all 
select 6,'萧龙王上海演唱会',6
)
SELECT * 
INTO TestTable
FROM info

declare @ids table (id int);
insert @ids( id )values (1)

WHILE EXISTS (SELECT 1 FROM TestTable WHERE InfoID>=(SELECT MAX(id) FROM @ids))
BEGIN

UPDATE TOP(1) TestTable
SET InfoTitle=InfoTitle+'_updated'
OUTPUT DELETED.InfoID INTO @ids
WHERE InfoID>=(SELECT MAX(id) FROM @ids)

END

------解决方案--------------------
曾经看过一句类似的话:CTE天生就擅长做递归循环。所以我一般在做递归,或者遍历时,会优先想到用CTE来尝试
两种差异其实很多,cte除了临时存放数据集,还能做递归,但是有个致命的缺点,必须定义后接着使用,如果定义了,跨了几个语句后再使用,就会报错。表变量算是比较单纯的“临时存储”,除非在创建时定义索引,不然创建后不能建立索引,另外表变量不管里面有多少数据,统计信息要么为0,要么为1,上面两个点导致表变量不适合存放和处理大数量,大量数据建议改用临时表。从写法上来说,在递归时,表变量和临时表写的东西貌似比CTE多。根据不同情景选择不同功能。非常准确的解释我也不懂,不想误导,大概就这个意思
------解决方案--------------------
引用:
Quote: 引用:

2005之后CTE功能应对这种问题还是很有效的,我测过大概几十万数据实现“逻辑遍历”,速度也就几秒钟


CTE 可以理解为临时命名的结果集,和表变量来比,他们的内部实现具体有什么不同的,一直没有仔细看过,还望版主给解惑。谢谢。

CTE就是内存表,表变量也是内存表,不同的是CTE内置递归实现,表变量要自己写WHILE实现,效率上CTE比表变量要稳定