[转载]SQLSERVER用无中生有的思想来替代游标 – 桦仔 – 博客园.
不过这篇文章的重点不是拼接SQL
重点是怎麽模仿游标
其实这个方法是最原始的方法,之前解决论坛问题的时候用过,想不到这次也能用上
关键代码有以下几句
1 CREATE TABLE #ttt (ID INT IDENTITY(1,1), pay_cost INT ) 2 3 SELECT IDENTITY( INT,1,1 ) AS ID, * INTO #temptb FROM t1 4 5 --获取#t1表的总行数 6 SELECT @COUNT = COUNT(*) FROM [#temptb] 7 WHILE @i <= @COUNT 8 SELECT @pay_level = [pay_level] FROM [#temptb] WHERE id = @i 9 SET @i = @i + 1 10 ---------------------------------- 11 SELECT A.[client], A.[pay_level], B.[pay_cost] 12 FROM [#temptb] AS A 13 INNER JOIN [#ttt] AS B ON A.[ID] = B.[ID] 14 ORDER BY A.[ID] ASC
原表是没有自增id的,我建一个临时表#temptb,临时表有一个自增id,并把原表的数据全部放入临时表
获取临时表的行数,用于循环
每次执行的时候根据 WHERE id = @i 来逐行逐行获取值,变量@i每次循环都递增1
将获取到的值都插入到#ttt这个临时表里面,然后根据ID的值做两表连接就可以得到LZ的结果
我说的无中生有就是“在原表里增加一个自增id方便循环,既简单又容易理解o(∩_∩)o ”
判断
我这里还用了一句
1 IF 'pay_lv_' + CAST(@pay_level AS VARCHAR(200)) IN ( SELECT NAME FROM SYS.[syscolumns] )
用于判断要获取值的pay_lv_列是否存在,如果存在就插入pay_lv_列的值,如果不存在就插入0
总结
其实如果觉得某样东西很难去实现,能不能用一个变通的方法呢?多动脑筋,办法会有的