问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

游标最最基础教程和解释

发布网友 发布时间:2022-04-23 04:50

我来回答

2个回答

热心网友 时间:2022-04-07 21:36

SqlServer 2000 游标用法小例

DECLARE CURSOR (T-SQL)创建游标 September 14th, 2006 by OoperMan (1 votes, average: 5 out of 5) Loading ... SQL Server 2005 联机丛书 DECLARE CURSOR (Transact-SQL) 更新日期: 2005 年 12 月 5 日

定义 Transact-SQL 服务器游标的属性,例如游标的滚动行为和用于生成游标所操作的结果集的查询。DECLARE CURSOR 接受基于 SQL-92 标准的语法和使用一组 Transact-SQL 扩展插件的语法。

Transact-SQL 语法约定

语法

SQL 92 Syntax DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR ...{ READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;] 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 必须符合标识符规则。有关标识符规则的详细信息,请参阅使用标识符作为对象名称。

INSENSITIVE 定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,则已提交的(任何用户)对基础表的删除和更新都反映在后面的提取中。

SCROLL 指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果未在 SQL-92 DECLARE CURSOR 中指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果也指定了 FAST_FORWARD,则不能指定 SCROLL。

select_statement 定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

Microsoft 如果 select_statement 中的子句与所请求的游标类型的功能有冲突,则 SQL Server 会将游标隐式转换为其他类型。有关详细信息,请参阅使用隐式游标转换。

READ ONLY 禁止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项优于要更新的游标的默认功能。

UPDATE [OF column_name [,…n]] 定义游标中可更新的列。如果指定了 OF column_name [,…n],则只允许修改列出的列。如果指定了 UPDATE,但未指定列的列表,则可以更新所有列。

cursor_name 所定义的 Transact-SQL 服务器游标的名称。cursor_name 必须符合标识符规则。有关标识符规则的详细信息,请参阅使用标识符作为对象名称。

LOCAL 指定对于在其中创建的批处理、存储过程或 触发器来说,该游标的作用域是局部的。该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程 OUTPUT 参数中,该游标可由局部游标变量引用。OUTPUT 参数用于将局部游标传递回调用批处理、存储过程或触发器,它们可在存储过程终止后给游标变量分配参数使其引用游标。除非 OUTPUT 参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐式释放。如果 OUTPUT 参数将游标传递回来,则游标在最后引用它的变量释放或离开作用域时释放。

GLOBAL 指定该游标的作用域对来说连接是全局的。在由连接执行的任何存储过程或批处理中,都可以引用该游标名称。该游标仅在断开连接时隐式释放。

注意:如果 GLOBAL 和 LOCAL 参数都未指定,则默认值由 default to local cursor 数据库选 项的设置控制。在 SQL Server 7.0 版中,该选项默认为 FALSE,以便与 SQL Server 的早期版本相匹配,在早期版本中,所有游标都是全局的。该选项的默认值在以后的 SQL Server 版本中可能会更改。有关详细信息,请参阅“设置数据库选项”。

FORWARD_ONLY 指定游标只能从第一行滚动到最后一行。FETCH NEXT 是唯一支持的提取选项。如果在指定 FORWARD_ONLY 时不指定 STATIC、KEYSET 和 DYNAMIC 关键字,则游标作为 DYNAMIC 游标进行操作。如果 FORWARD_ONLY 和 SCROLL 均未指定,则除非指定 STATIC、KEYSET 或 DYNAMIC 关键字,否则默认为 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游标默认为 SCROLL。与 ODBC 和 ADO 这类数据库 API 不同,STATIC、KEYSET 和 DYNAMIC Transact-SQL 游标支持 FORWARD_ONLY。

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

KEYSET 指定当游标打开时,游标中行的成员身份和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。

注意:如果查询引用了至少一个无唯一索引的表,则键集游标将转换为静态游标。

对基表中的非键值所做的更改(由游标所有者更改或由其他用户提交)可以在用户滚动游标时看到。其他用户执行的插入是不可见的(不能通过 Transact-SQL 服务器游标执行插入)。如果删除行,则在尝试提取行时返回值为 -2 的 @@FETCH_STATUS。从游标以外更新键值类似于删除旧行然后再插入新行。具有新值的行是不可见的,并在尝试提取具有旧值的行时,将返回值为 -2 的 @@FETCH_STATUS。如果通过指定 WHERE CURRENT OF 子句利用游标来完成更新,则新值是可见的。

DYNAMIC 定义一个游标,以反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持 ABSOLUTE 提取选项。

FAST_FORWARD 指定启用了性能优化的 FORWARD_ONLY、READ_ONLY 游标。如果指定了 SCROLL 或 FOR_UPDATE,则不能也指定 FAST_FORWARD。

注意:在 SQL Server 2000 中,FAST_FORWARD 和 FORWARD_ONLY 游标选项是互相排斥的。如果指定了二者,则会引发错误。在 SQL Server 2005 中,这两个关键字可以用在同一个 DECLARE CURSOR 语句中。

READ_ONLY 禁止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项优于要更新的游标的默认功能。

SCROLL_LOCKS 指定通过游标进行的定位更新或删除保证会成功。将行读取到游标中以确保它们对随后的修改可用时,Microsoft SQL Server 将锁定这些行。如果还指定了 FAST_FORWARD 或 STATIC,则不能指定 SCROLL_LOCKS。

OPTIMISTIC 指定如果行自从被读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不会成功。当将行读入游标时 SQL Server 不会锁定行。相反,SQL Server 使用 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 中的子句与所请求的游标类型的功能有冲突,则 SQL Server 会将游标隐式转换为其他类型。有关详细信息,请参阅“隐式游标转换”。

FOR UPDATE [OF column_name [,…n]] 定义游标中可更新的列。如果提供了 OF column_name [,…n],则只允许修改列出的列。如果指定了 UPDATE,但未指定列的列表,则除非指定了 READ_ONLY 并发选项,否则可以更新所有的列。

备注

DECLARE CURSOR 定义 Transact-SQL 服务器游标的属性,例如游标的滚动行为和用于生成游标所操作的结果集的查询。OPEN 语句填充结果集,FETCH 从结果集返回行。CLOSE 语句释放与游标关联的当前结果集。DEALLOCATE 语句释放游标所使用的资源。

DECLARE CURSOR 语句的第一种格式使用 SQL-92 语法声明游标行为。DECLARE CURSOR 的第二种格式使用 Transact-SQL 扩展插件,这些扩展插件允许您使用在 ODBC 或 ADO 的数据库 API 游标函数中所使用的相同游标类型来定义游标。

不能混淆这两种格式。如果在 CURSOR 关键字的前面指定 SCROLL 或 INSENSITIVE 关键字,则不能在 CURSOR 和 FOR select_statement 关键字之间使用任何关键字。如果在 CURSOR 和 FOR select_statement 关键字之间指定任何关键字,则不能在 CURSOR 关键字的前面指定 SCROLL 或 INSENSITIVE。

如果使用 Transact-SQL 语法的 DECLARE CURSOR 不指定 READ_ONLY、OPTIMISTIC 或 SCROLL_LOCKS,则默认值如下:

如果 SELECT 语句不支持更新(由于权限不够、访问的远程表不支持更新等等),则游标为 READ_ONLY。

STATIC 和 FAST_FORWARD 游标默认为 READ_ONLY。

DYNAMIC 和 KEYSET 游标默认为 OPTIMISTIC。

游标名称只能被其他 Transact-SQL 语句引用。它们不能被数据库 API 函数引用。例如,声明游标之后,不能通过 OLE DB、ODBC 或 ADO 函数或方法引用游标名称。不能使用提取函数或 API 的方法来提取游标行;只能通过 Transact-SQL FETCH 语句提取这些行。

在声明游标后,可使用下列系统存储过程确定游标的特性。

系统存储过程 说明 sp_cursor_list 返回当前在连接上可视的游标列表及其特性。

sp_describe_cursor 说明游标属性,例如是只前推的游标还是滚动游标。

sp_describe_cursor_columns 说明游标结果集中的列的属性。

sp_describe_cursor_tables 说明游标所访问的基表。

在声明游标的 select_statement 中可以使用变量。游标变量值在声明游标后不发生更改。在 SQL Server 版本 6.5 以及早期版本中,每次重新打开游标时都会重新刷新变量值。

权限

默认情况下,将 DECLARE CURSOR 权限授予对游标中所使用的视图、表和列具有 SELECT 权限的任何用户。

示例

A. 使用简单游标和语法

在打开该游标时所生成的结果集包括表中的所有行和所有列。可以更新该游标,对该游标所做的所有更新和删除均在提取中表现出来。因为未指定 SCROLL 选项,所以 FETCH NEXT 是唯一可用的提取选项。

DECLARE vend_cursor CURSOR FOR SELECT * FROM Purchasing.Vendor OPEN vend_cursor FETCH NEXT FROM vend_cursor B. 使用嵌套游标生成报表输出

以下示例显示如何嵌套游标以生成复杂的报表。为每个供应商声明内部游标。

SET NOCOUNT ON DECLARE @vendor_id int, @vendor_name nvarchar(50), @message varchar(80), @proct nvarchar(50) PRINT '-------- Vendor Procts Report --------' DECLARE vendor_cursor CURSOR FOR SELECT VendorID, Name FROM Purchasing.Vendor WHERE PreferredVendorStatus = 1 ORDER BY VendorID OPEN vendor_cursor FETCH NEXT FROM vendor_cursor INTO @vendor_id, @vendor_name WHILE @@FETCH_STATUS = 0 BEGIN PRINT ' ' SELECT @message = '----- Procts From Vendor: ' + @vendor_name PRINT @message -- Declare an inner cursor based -- on vendor_id from the outer cursor. DECLARE proct_cursor CURSOR FOR SELECT v.Name FROM Purchasing.ProctVendor pv, Proction.Proct v WHERE pv.ProctID = v.ProctID AND pv.VendorID = @vendor_id-- Variable value from the outer cursor OPEN proct_cursor FETCH NEXT FROM proct_cursor INTO @proct IF @@FETCH_STATUS <> 0 PRINT ' <<None>>' WHILE @@FETCH_STATUS = 0 BEGIN SELECT @message = ' ' + @proct PRINT @message FETCH NEXT FROM proct_cursor INTO @proct END CLOSE proct_cursor DEALLOCATE proct_cursor -- Get the next vendor. FETCH NEXT FROM vendor_cursor INTO @vendor_id, @vendor_name END CLOSE vendor_cursor DEALLOCATE vendor_cursor

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qinghecool/archive/2008/06/25/2586675.aspx

参考资料:http://blog.csdn.net/qinghecool/archive/2008/06/25/2586675.aspx

热心网友 时间:2022-04-07 22:54

sql2000的游标:

declare @TableName nvarchar(50),@sql nvarchar(4000)
declare my_cursor cursor for select [name] from sysobjects where (name like '历史记录表%' and OBJECTPROPERTY(id, N'IsUserTable') = 1)
Open my_cursor
Fetch Next From my_cursor into @TableName
while @@fetch_status=0
begin
set @sql='ALTER TABLE '+@TableName+' ADD 传感器短路 varchar(50) COLLATE Chinese_PRC_CI_AS NULL'
exec (@sql)
Fetch Next From my_cursor into @TableName
end
close my_cursor
deallocate my_cursor

上面这段是从我是我原来用过的 应该是个最简的游标应用了 看懂了就理解游标了
看懂后需要注意Fetch Next From my_cursor into @TableName这句into后面的变量数要和定义游标时查询语句返回结果的字段数量一致。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎么在拼多多快速拍单(拼多多快速拍单技巧) 拼多多卖家怎么拍单快一点(拼多多卖家如何快速拍单) 做拼多多店群怎么快速拍单(如何快速生成拼多多店群订单) 拼多多店群如何拍单啊(拼多多店群怎么下单) 求外贸英语高手:这句怎么翻译?The pallets for sheet consignments are... 龙阳泣鱼的意思是什么 龙阳泣鱼的意思 怎么理解龙阳泣鱼的意思 宁德时代代码 他们说用Qlarité (Qlarite)可以抗衰? 关于Qlarité,请问效果怎样? sqlserver这个如何用游标来实现 sql server中游标的作用?何时使用游标? sqlserver 游标用法 sqlserver 游标有哪些属性 sql server中的游标 什么是SqlServer游标 sql 中游标的作用及使用方法? 微信怎么改 已注册的怎样更改 微信怎样修改自己的名字和 微信收款音响S2手机不在店里还能播放吗? 奥雅之光恶魔,苍蓝,绯红那个最强 穿越异界搞共产主义的小说 猩红崛起by真诸葛风行小说可以在线看的 《猩红崛起》txt下载在线阅读全文,求百度网盘云资源 LpR利率和房贷基准利率哪个更划算? 苏州公积金买房流程有哪些 在苏州市内,购房公积金贷款需要什么条件 什么是LPR?和原来的基准利率比有什么不同? 苏州公积金买房要交多久 oracle中游标的作用有哪些?什么情况下使用? SQLSERVER 游标问题 sqlserver游标的优缺点 sqlserver里面有哪几种游标 SQLserver 大批量更新插入的时候游标怎么优化 存储过程中游标的使用 嵌入式SQL语言中使用游标的作用 Sqlserver中什么是存储过程,索引,游标,分别解释解释 请写出游标和存储过程的概念及其在数据库编程中发挥什么样的作用_百度... sqlserver 2005 函数+游标 微信收款音响s3手机不在还可以用吗?我寸买了一个S3,可没用几天一充电不响了,啥原因呢? 多菌灵给土消毒怎么用 请问:关于多菌灵土壤消毒 请高人指教了,一小袋10克多菌灵兑多少斤水能有效搅拌多少土壤进行消毒... 多菌灵土壤消毒 如何给土壤杀菌消毒呢? 苹果iPhone 7 Plus怎么下载东西? 多菌灵用于土壤杀菌每亩用多少量? 怎样在苹果7自带的浏览器上下载软件? 土壤消毒的最好方法