SQL Server 中游标的使用

1.游标是行读取,占用资源比sql多
2.游标的使用情景:
  ->现存的系统中使用的是游标,查询必须通过游标来实现
  ->用尽了while、子查询临时表、表变量、自定义函数以及其他方式仍然无法实现的时候,使用游标
3.T-SQL 中游标的生命周期由5部分组成
   ->定义游标:游标的定义遵循T-Sql的定义方法,赋值有两种方法,定义时赋值,和先定义后赋值,定义游标像定义其他局部变量一样前面要加@,注意如果是全局的游标,只支持定义时直接赋值,并且不能在游标前面加@
   --定义时直接赋值
   Declare test_Cursor Cursor For
   select * from dbo.tb1
   
   --先定义后赋值
   Declare @test_Cursor2 Cursor
   set @test_Cursor2=Cursor For
   select * from dbo.tb2
   
   Local和Global
     Local意味着游标的生命周期只在批处理或函数或存储过程中可见,而Global意味着游标对于特定的连接作为上下文,全局有效
     --定义后直接赋值(全局)
     Declare test_Cursor Cursor GLOBAL For
     select * from dbo.tb1
     --(局部)
     Declare test_Cursor2 Cursor LOCAL For
     select * from dbo.tb2
     --用GO结束上面的作用域
     GO
     Open test_Cursor
     Open test_Cursor2
     
     报错:test_Cursor2不存在
     
     注意:如果不指定游标作用域,默认为GLOBAL
   Forward_Only和Scroll 二选一
     Forward_Only意味着游标只能从数据集开始向着数据集结束的方向读取,唯一选项Fetch Next,而Scroll支持游标在定义数据集上向着任何方向或者任何位置移动
     --不加参数默认为Forward_only
     Declare test_Cursor Cursor For
     select * from dbo.tb1
     --加Forward_Only
     Declare test_Cursor2 Cursor Forward_Only For
     select * from dbo.tb1
     --加Scroll
     Declare test_Cursor3 Cursor Scroll For
     select * from dbo.tb1
     
     Open test_Cursor
     Open test_Cursor2
     Open test_Cursor3
     Fetch Last from test_Cursor
     Fetch Last from test_Cursor2
     Fetch Last from test_Cursor3--读取最后一行
     
     报错:只进游标test_Cursor不能与last一起使用,只进游标test_Cursor2不能与last一起使用
   Static Keyset Dynamic 和 Fast_Forward四选一
     这四个关键字是游标所在的数据集所反应的表内数据和游表读取出数据的关系。
     Static:意味着,当游标被建立时候,将会创建For后面的select 语句所包含数据集的副本存入tempdb数据库中,任何对于底层表内数据的更改不会影响到游标的内容
     Dynamic:是和Static完全相反的选项,当底层数据库更改时,游标的内容也随之待到放映,在下一次fetch中,数据内容会随之改变
     Keyset:可以理解为介于Static和Dynamic的折中方案。蒋友柏所在结果集的唯一能确定每一行的主键存入tempdb,当结果中任何行改变或者删除时,@@FETCH_STATUS为-2,KEYSET无法探测新加入的数据
     FAST_FORWAED可以理解成FORWARD_ONLY的优化版本,FORWARD_ONLY执行的是经计划,而FAST_FORWARD是根据情况进行选择采用动态计划还是静态计划,大多数情况下FAST_FORWARD要比FORWARD_ONLY性能略好
   READ_ONLY SCROLL_LOCKS OPTIMISTIC三选一
     READ_ONLY:意味着声明的游标只能读取数据,游标不能做任何更新操作
     SCROLL_LOCKS:是另一种极端,将读入游标的所有数据进行锁定,防止其他程序进行更改,以确保更行的绝对成功
     OPTIMISTIC:是相对比较好的一个选择,OPTIMISTIC不锁定任何数据,当需要在游标中更新数据时,如果底层数据更新,测游标内数据更新不成功,如果底层表数据为更新,则游标南日表数据可以更新
   ->打开游标:Open test_Cursor 注意,当全局游标和局部游标变量重名时,默认会打开局部变量游标
   ->使用游标:游标分为两部分,一部分是操作游标在数据集内的指向,另一部分是将游标所直向的行的部分或全部内容进行操作
   只支持6中移动选项,到第一行(FIRST),最后一行(LAST),下一行(NEXT),上一行(PRIOR),直接跳到某一行(ABSOLUTE(n)),相对于目前跳到几行(RELATIVE(n))
     --必须指定SCROLL否则只支持next只进选项
     DECLARE test_Cursor SCROLL FOR
     select * from dbo.tb1
     
     OPEN test_Cursor
     DECLARE @c nvarchar(10)
     --取下一行
     Fetch next from test_Cursor into @c
     print @c
     --取最后一行
     Fetch Last From test_Cursor into @c
     print @c
     --取第一行
     Fetch first from test_Cursor into @c
     print @c
     --取上一行
     fetch prior from test_Cursor into @c
     print @c
     --取第三行
     fetch absolute 3 from test_Cursor into @c
     print @c
     --取相对目前来说上一行(-2相对于目前来说向上移动2行,2对目前来说向下移动2行)
     fetch relative -1 from test_Cursor into @c
     print @c
   对于为指定SCROLL的,只能用NEXT选项
   游标经常回和全局变量@@FETCH_STATUS 与WHITLE循环来共同使用,从来遍历游标所在的数据集
     Declare test_Cursor cursor scroll for
     select id,name from dbo.tb1
     Open test_Cursor
     Declare @id int
     Declare @name nvarchar(10)
     
     while @@FETCH_STATUS=0
     begin
     print @id
     print @name
     Fetch next from test_Cursor into @id,@name
     end
     
     Close test_Cursor
     Deallocate test_Cursor
   ->关闭游标: Close test_Cursor
   ->释放游标: Deallocate test_Cursor
  
   注释1:
  ->游标的定义的复杂程度是和参数有关,而游标的参数设置是对游标的原理了解程度。
  ->游标的原理:游标是定义在特定数据集上的指针,我们控制这个指针遍历数据集,或者仅仅是指向特定的行,所以游标是定义在以select开始的数据集上的。
  
  
 注释2:
  如果能不用游标,尽量不要使用游标
     用完用完之后一定要关闭和释放
     尽量不要在大量数据上定义游标
     尽量不要使用游标上更新数据
     尽量不要使用insensitive, static和keyset这些参数定义游标
     如果可以,尽量使用FAST_FORWARD关键字定义游标
     如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数

时间: 2024-10-13 22:29:02

SQL Server 中游标的使用的相关文章

sql 语句中游标的使用

SQL中游标的使用(转)

一般情况下,我们用SELECT这些查询语句时,都是针对的一行记录而言,如果要在查询分析器中对多行记录(即记录集)进行读取操作时,则需要使用到游标或WHILE等循环 游标的类型:  1.静态游标(不检测数据行的变化)  2.动态游标(反映所有数据行的改变)  3.仅向前游标(不支持滚动)  4.键集游标(能反映修改,但不能准确反映插入.删除) 游标使用顺序:   1.定义游标   2.打开游标   3.使用游标   4.关闭游标   5.释放游标 Transact-SQL:declare 游标名

SQL Server带游标的SQL

DECLARE test_cursor CURSOR FOR SELECT ID FROM dbo.T_BD_Restaurant WHERE id <> '0AAB2E55-79F8-4F41-AFFA-00179DFABDB0' OPEN test_cursor DECLARE @RestaurantID NVARCHAR(100) FETCH NEXT FROM test_cursor INTO @RestaurantID WHILE @@FETCH_STATUS = 0 BEGIN P

SQL Server中使用数据库快照的方式来完成测试环境中数据库的轻量级备份还原操作

原文:SQL Server中使用数据库快照的方式来完成测试环境中数据库的轻量级备份还原操作 在开发或者测试环境的数据库中,经常会发现有开发或者测试人员误删除表或者数据的情况,对于开发或者测试库,一般都没有安排定时的备份任务去备份数据库,一方面是由于存储资源有限,不太可能给开发或者测试环境准备大量的存储空间,二是必要性不是很强,开发或者测试库的数据库对象变化太多,通过还原备份的方式又有可能冲掉其最近新建的数据库对象.但是不得不面对的问题就是个别人在执行update或者delete操作的时候“忘了加

SQL Server基础之&lt;游标&gt;

查询语句可能返回多条记录,如果数据量非常大,需要使用游标来逐条读取查询结果集中的记录.应用程序可以根据需要滚动或浏览其中的数据.本篇介绍游标的概念.分类.以及基本操作等内容. 一:认识游标   游标是SQL Server的一种数据访问机制,它允许用户访问单独的数据行.用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成的SQL代码并立即执行或输出. 1.游标的概念  游标是一种处理数据的方法,主要用于存储过程,触发器和 T_SQL脚本中,它们使结果集的内容

Oracle和SQL SERVER在SQL语句上的差别

Oracle与Sql server都遵循SQL-92标准:http://owen.sj.ca.us/rkowen/howto/sql92F.html,但是也有一些不同之处,差别如下: Oracle中表名,字段名,存储过程名,变量名不能超过30个字符串长度. Oracle中不支持Top 语法.使用whererownum < n 代替.但需要注意如果在Top前有排序的操作,则需要先排序在利用rownum取得. Oracle中光标的使用与SqlServer中有挺大差别,主要是在循环控制方面不一致. 在

关于sql server动态获取数据库下所有表以及游标的简单使用

需求是这样的,在SQL SERVER中的Stock库下,有两千多张表.需要每张表都删除今天的一条错误数据. 首先得要得到所有表的名称,代码如下: Select name FROM SysObjects Where XType='U' and name <>'InsertHistory' order BY Name ; SysObjects是一张系统表,它会记录在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等)在表中占一行.只有在 tempdb 内,每个临时对象才在该表中占一行.

SQL Server 2008数据类型

在创建表时,必须为表中的每列指派一种数据类型.本节将介绍SQL Server中最常用的一些数据类型.即使创建自定义数据类型,它也必须基于一种标准的SQL Server数据类型.例如,可以使用如下语法创建一种自定义数据类型(Address),但要注意,它基于SQL Server标准的varchar数据类型. CREATE TYPE Address FROM varchar(35) NOT NULL 如果在SQL Server Management Studio的表设计界面中更改一个大型表中某列的数

SQL Server基础

一.常用命令 1.使用命令行开启SQL Server服务 获取管理员权限的命令行工具: net start mssqlserver 开启sql server服务 net restart mssqlserver 重新启动sql server服务 net stop mssqlserver 关闭sql server服务 2.使用命令登陆(该方法可适用于在一台没有SQL Server的电脑去操作一台有SQL Server的电脑) 运行: sqpl ?/ [-S 服务器的名称]  [-U 登陆名] [-P