乐趣区

SQLServer之创建Transact-SQL游标

什么是游标
结果集,结果集就是 select 查询之后返回的所有行数据的集合。
游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。
一般复杂的存储过程,都会有游标的出现,他的用处主要有:
定位到结果集中的某一行。对当前位置的数据进行读写。可以对结果集中的数据单独操作,而不是整行执行相同的操作。是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。
游标使用三步曲:第一步创建游标,第二步打开游标,第三步使用游标。
游标的使用范围是当前会话。
游标使用
第一步创建游标
语法
– 声明数据库引用 use testss;go
– 第二种 Transact-SQL 扩展语法 –Transact-SQL Extended Syntax declare cursor_name cursor [local | global] [forward_only | scroll] [static | keyset | dynamic | fast_forward] [read_only | scroll_locks | optimistic] [type_warning] for select_statement [for update [ of column_name [ ,…n] ] ] [;]
语法注释
–cursor_name–Transact-SQL 服务器游标定义的名称。cursor_name 必须符合有关标识符的规则。
–local– 指定该游标的范围对在其中创建它的批处理、存储过程或触发器是局部的。– 该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程 output 参数中,该游标可由局部游标变量引用。–output 参数用于将局部游标传递回调用批处理、存储过程或触发器,它们可在存储过程终止后给游标变量分配参数使其引用游标。– 除非 output 参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐式释放。如果 output 参数将游标传递回来,则游标在最后引用它的变量释放或离开作用域时释放。
–global– 指定该游标范围对连接是全局的。在由此连接执行的任何存储过程或批处理中,都可以引用该游标名称。– 该游标仅在断开连接时隐式释放。– 备注 – 如果 global 和 local 参数都未指定,则默认值由“默认为本地游标”数据库选项的设置控制。
–forward_only– 指定游标只能从第一行滚动到最后一行。fetch next 是唯一支持的提取选项。– 如果指定了 forward_only 而没有指定 static、keyset 和 dynamic 关键字,则游标作为 dynamic 游标进行操作。– 如果未指定 forward_only 和 scroll,则默认为 forward_only,– 除非指定了关键字 static、keyset 或 dynamic。static、keyset 和 dynamic 游标默认为 scroll。– 与 odbc 和 ado 等数据库 API 不同,static、keyset 和 dynamic Transact-SQL 游标支持 forward_only。
–scroll– 指定所有的提取选项(first、last、prior、next、relative 和 absolute)均可用。如果未在 iso declare cursor 中指定 scroll,则 next 是唯一支持的提取选项。– 如果还指定了 fast_forward,则无法指定 scroll。
–static– 定义一个游标,以创建将由该游标使用的数据的临时副本。对游标的所有请求都从 tempdb 中的这一临时表中得到应答;– 因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。
–keyset– 指定当游标打开时,游标中行的成员身份和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。– 备注 – 如果查询引用了至少一个无唯一索引的表,则键集游标将转换为静态游标。– 对基表中的非键值所做的更改(由游标所有者更改或由其他用户提交)可以在用户滚动游标时看到。– 其他用户执行的插入是不可见的(不能通过 Transact-SQL 服务器游标执行插入)。如果删除某一行,则在尝试提取该行时返回的 @@fetch_status 为 -2。– 从游标外部更新键值类似于删除旧行后再插入新行。具有新值的行不可见,且尝试提取具有旧值的行时返回的 @@fetch_status 为 -2。– 如果通过指定 where current of 子句来通过游标执行更新,则新值可见。
–dynamic– 定义一个游标,以反映在滚动游标时对结果集内的各行所做的所有数据更改。– 行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持 absolute 提取选项。
–fast_forward– 指定已启用了性能优化的 fast_forward 和 read_only 游标。如果还指定了 scroll 或 for_update,则无法指定 fast_forward。– 备注 – 可以在相同的 declare cursor 语句中使用 fast_forward 和 forward_only。
–read_only– 禁止通过该游标进行更新。无法在 update 或 delete 语句的 where current of 子句中引用游标。– 该选项优先于要更新的游标的默认功能。
–scroll_locks– 指定通过游标进行的定位更新或删除一定会成功。将行读入游标时 SQLServer 将锁定这些行,以确保随后可对它们进行修改。– 如果还指定了 fast_forward 或 static,则无法指定 scroll_locks。
–optimistic– 指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。– 当将行读入游标时,SQLServer 不锁定行。– 相反,它使用 timestamp 列值的比较,或者如果表没有 timestamp 列则使用校验和值,以确定将行读入游标后是否已修改该行。– 如果已修改该行,尝试进行的定位更新或定位删除将失败。如果还指定了 fast_forward,则无法指定 optimistic。
–type_warning– 指定如果游标从所请求的类型隐式转换为另一种类型,则向客户端发送警告消息。
–select_statement– 定义游标结果集的标准 select 语句。在游标声明的 select_statement 中不允许使用关键字 compute、compute by、for browse 和 into。– 备注 – 可以在游标声明中使用查询提示;但如果还使用 for update of 子句,请在 for update of 之后指定 option(<query_hint>)。– 如果 select_statement 中的子句与所请求的游标类型的功能有冲突,则 SQLServer 会将游标隐式转换为其他类型。有关详细信息,请参阅“隐式游标转换”。
–for update [of column_name [,…n]]– 定义游标中可更新的列。如果提供了 of <column_name> [, <… n>],则只允许修改所列出的列。如果指定了 update,但未指定列的列表,则除非指定了 read_only 并发选项,否则可以更新所有的列。
示例
declare firstcursor cursorscrollstaticread_onlytype_warningforselect id,name from test1–for update;
示例结果

第二步打开游标
语法
open {{ [ global] cursor_name } | cursor_variable_name }
语法解析
–global– 指定 cursor_name 是指全局游标。–cursor_name– 已声明的游标的名称。当同时存在以 cursor_name 作为名称的全局游标和局部游标时,如果指定 global,则 cursor_name 是指全局游标;否则,cursor_name 是指局部游标。–cursor_variable_name– 游标变量的名称,该变量引用一个游标。
示例
open firstcursor;
示例结果

第三步使用游标
语法
fetch [[ next | prior | first | last | absolute { n | @nvar} | relative {n | @nvar} ] from ] {{ [ global] cursor_name } | @cursor_variable_name } [into @variable_name [ ,…n] ]
语法注释
–next– 紧跟当前行返回结果行,并且当前行递增为返回行。如果 fetch next 为对游标的第一次提取操作,则返回结果集中的第一行。next 为默认的游标提取选项。
–prior– 返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果 fetch prior 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。
–first– 返回游标中的第一行并将其作为当前行。
–last– 返回游标中的最后一行并将其作为当前行。
–absolute {n| @nvar}– 如果 n 或 @nvar 为正,则返回从游标起始处开始向后的第 n 行,并将返回行变成新的当前行。– 如果 n 或 @nvar 为负,则返回从游标末尾处开始向前的第 n 行,并将返回行变成新的当前行。– 如果 n 或 @nvar 为 0,则不返回行。n 必须是整数常量,并且 @nvar 必须是 smallint、tinyint 或 int。
–relative {n| @nvar}– 如果 n 或 @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。– 如果 n 或 @nvar 为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。– 如果 n 或 @nvar 为 0,则返回当前行。在对游标进行第一次提取时,– 如果在将 n 或 @nvar 设置为负数或 0 的情况下指定 fetch relative,则不返回行。n 必须是整数常量,并且 @nvar 必须是 smallint、tinyint 或 int。
–global– 指定 cursor_name 是指全局游标。
–cursor_name– 要从中进行提取的开放游标的名称。当同时存在以 cursor_name 作为名称的全局游标和局部游标时,– 如果指定 global,则 cursor_name 指全局游标,如果未指定 global,则指局部游标。
–@cursor_variable_name– 游标变量名,引用要从中进行提取操作的打开的游标。
–into @variable_name[,…n]– 允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。– 各变量的数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。变量的数目必须与游标选择列表中的列数一致。
示例
declare @id nvarchar(50),@name nvarchar(50);fetch first from firstcursor into @id,@name;select @id,@name;
示例结果

退出移动版