sql2008游标FORWARD_ONLY STATIC 的使用方式

CREATE TABLE #xms_staff_department
(
  id int,
  name varchar(128),
  parent_id int,
  parent_path varchar(512) ,
  depth smallint,
  is_delete tinyint,
  sort smallint
)
INSERT INTO #xms_staff_department
SELECT id,name,0,‘0,‘+CONVERT(VARCHAR,id),1, (CASE WHEN IsVaild = 1 THEN 0 ELSE 1 END), dOrder FROM dept WHERE Pid = 0

DECLARE @id				INT
DECLARE @parent_path	VARCHAR(128)
DECLARE @cursor1			CURSOR
SET @cursor1 = CURSOR FORWARD_ONLY STATIC FOR
SELECT id, parent_path FROM #xms_staff_department
OPEN @cursor1
FETCH NEXT FROM @cursor1 INTO @id, @parent_path
WHILE (@@FETCH_STATUS = 0)
BEGIN

	INSERT INTO #xms_staff_department
	SELECT id,name,Pid, @parent_path+‘,‘+CONVERT(VARCHAR,id),2, (CASE WHEN IsVaild = 1 THEN 0 ELSE 1 END), dOrder FROM dept WHERE Pid = @id

	DECLARE @cursor2			CURSOR
	DECLARE @id2				INT
	DECLARE @parent_path2	VARCHAR(128)
	SET @cursor2 = CURSOR FORWARD_ONLY STATIC FOR
	SELECT id, parent_path FROM #xms_staff_department WHERE parent_id = @id
	OPEN @cursor2
	FETCH NEXT FROM @cursor2 INTO @id2, @parent_path2
	WHILE (@@FETCH_STATUS = 0)
	BEGIN 

		INSERT INTO #xms_staff_department
		SELECT id,name,Pid, @parent_path+‘,‘+CONVERT(VARCHAR,id),3, (CASE WHEN IsVaild = 1 THEN 0 ELSE 1 END), dOrder FROM dept WHERE Pid = @id2

		DECLARE @cursor3			CURSOR
		DECLARE @id3				INT
		DECLARE @parent_path3	VARCHAR(128)
		SET @cursor3 = CURSOR FORWARD_ONLY STATIC FOR
		SELECT id, parent_path FROM #xms_staff_department WHERE parent_id = @id2
		OPEN @cursor3
		FETCH NEXT FROM @cursor3 INTO @id3, @parent_path3
		WHILE (@@FETCH_STATUS = 0)
		BEGIN

			INSERT INTO #xms_staff_department
			SELECT id,name,Pid, @parent_path+‘,‘+CONVERT(VARCHAR,id),4, (CASE WHEN IsVaild = 1 THEN 0 ELSE 1 END), dOrder FROM dept WHERE Pid = @id3

			DECLARE @cursor4			CURSOR
			DECLARE @id4				INT
			DECLARE @parent_path4	VARCHAR(128)
			SET @cursor4 = CURSOR FORWARD_ONLY STATIC FOR
			SELECT id, parent_path FROM #xms_staff_department WHERE parent_id = @id3
			OPEN @cursor4
			FETCH NEXT FROM @cursor4 INTO @id4, @parent_path4
			WHILE (@@FETCH_STATUS = 0)
			BEGIN

				INSERT INTO #xms_staff_department
				SELECT id,name,Pid, @parent_path+‘,‘+CONVERT(VARCHAR,id),5, (CASE WHEN IsVaild = 1 THEN 0 ELSE 1 END), dOrder FROM dept WHERE Pid = @id4			

				FETCH NEXT FROM @cursor4 INTO @id4, @parent_path4
			END
			CLOSE @cursor4
			DEALLOCATE @cursor4			

			FETCH NEXT FROM @cursor3 INTO @id3, @parent_path3
		END
		CLOSE @cursor3
		DEALLOCATE @cursor3	

		FETCH NEXT FROM @cursor2 INTO @id2, @parent_path2
	END
	CLOSE @cursor2
	DEALLOCATE @cursor2

	FETCH NEXT FROM @cursor1 INTO @id, @parent_path
END
CLOSE @cursor1
DEALLOCATE @cursor1

select * from #xms_staff_department
drop table #xms_staff_department

上述是个简单的sql游标的使用方法,写法很水,但需要注意的是

SET @cursor = CURSOR FORWARD_ONLY STATIC FOR "标注红色的使用"

备注: SQL游标的执行效率之静态游标的高效率执行

STATIC静态游标创建将由该游标使用的数据的临时复本,对游标的所有请求都从tempdb 中的这一临时表中得到应答,因此在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改

FORWARD_ONLY 指定数据只能从第一条到最后一条

时间: 2024-10-16 14:17:28

sql2008游标FORWARD_ONLY STATIC 的使用方式的相关文章

C++中static 的使用方式,以及与c中的static的区别

http://blog.csdn.net/hackbuteer1/article/details/7487694 c++中static有种使用方式:面向过程的static,面向对象的static.前者用于普通变量或函数,不涉及类.而后者出现在类中. 一:面向过程的static , 1.静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变量的例子,如下: 1 #include<iostream> 2 using namespace std;

浅谈游标选项 Static|Keyset|DYNAMIC|FAST_FORWARD

接好久之前太监的一篇Blog.现在补充几个选项的介绍 所用的语句都是这个 IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 GO CREATE TABLE T1 ( ID INT PRIMARY KEY, seq INT ) DECLARE @seq INT=0 WHILE @seq < 50 BEGIN INSERT INTO dbo.T1 ( ID,seq ) VALUES ( @seq+1,@seq) SET @seq=@seq+1 END 1 DE

Sql2008 r2 使用ftp 公布和订阅方式同步数据

Sql2008 r2使用公布和订阅方式同步数据 因为非常多图片 本篇没有图片 详情能够进入下载页  http://download.csdn.net/download/yefighter/7603741 1:公布服务器:公布方 sql2008 r2 iis7.5 windows server 2008 请登入服务器进行操作 不要用sqlserver远程连接 必须开启sqlserver agent服务以及开机自己主动启动 右键属性 打开sqlserver 点击新建本地公布 第一次公布的时候 会提示

Sql2008 r2 使用ftp 发布和订阅方式同步数据

Sql2008 r2使用发布和订阅方式同步数据 由于很多图片 本篇没有图片 详情可以进入下载页  http://download.csdn.net/download/yefighter/7603741 1:发布服务器:发布方 sql2008 r2 iis7.5 windows server 2008 请登入服务器进行操作 不要用sqlserver远程连接 必须开启sqlserver agent服务以及开机自动启动 右键属性 打开sqlserver 点击新建本地发布 第一次发布的时候 会提示创建发

SQL Server游标的使用【转】

游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式是: 而对于游标来说: 这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量…… 从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方: 当你从ATM取钱

SQL Server中的游标CURSOR

游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式是: 而对于游标来说: 这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量…… 从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方: 当你从ATM取钱

游标是邪恶的!

在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式是: 而对于游标来说: 这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量…… 从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方: 当你从ATM取钱的时候,是一次取

T-SQL游标

游标是面向行的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 在性能上,游标会迟更多的内存,减少可用的并发,占用带宽,锁定资源,当然还有更多的代码量. 用一个比喻来说明为什么游标会占用更多的资源.当你从ATM机取款的时候,是一次取1000的效率更高呢,还是10次100呢? 既然游标那么多缺点,为什么要学习游标呢? 现存系统有一些游标,我们查询必须通过游标来实现. 作用一个备用方式,当使用while.子查询,临时表,表变量,自建函数或其他方式仍然无法实现某些查询的时候,可以使用游

SQLServer游标详解

一.游标概念 我们知道,关系数据库所有的关系运算其实是集合与集合的运算,它的输入是集合输出同样是集合,有时需要对结果集逐行进行处理,这时就需要用到游标.我们对游标的使用一本遵循"五步法":声明游标->打开游标->读取数据->关闭游标->删除游标.以下就从这五步对游标的使用进行说明,并给出具体实例. 二."五步法"讲解 1.声明游标(DECLARE CURSOR) (1) DECLARE CURSOR 既接受基于 ISO 标准的语法,也接受使用