如果想对表的每行记录进行一个操作,就需要用到表遍历。
除了游标,表变量,临时表,还有其他的方法吗?
------解决方案--------------------
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多。根据不同情景选择不同功能。非常准确的解释我也不懂,不想误导,大概就这个意思
------解决方案--------------------
CTE就是内存表,表变量也是内存表,不同的是CTE内置递归实现,表变量要自己写WHILE实现,效率上CTE比表变量要稳定