游标问题提问!

fly29 2005-03-26 10:18:19
有两个问题:
1 我使用了游标嵌套,是不是会出错!我还没有测试
2 怎样判断一个游标是否到了最后一条记录?
---------
高手请教!
...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly29 2005-03-28
  • 打赏
  • 举报
回复
up again
fly29 2005-03-26
  • 打赏
  • 举报
回复
--如果游标到了最后一条记录
FETCH NEXT FROM field_cursor
if @@FETCH_STATUS <>0
@str=@str+''
else
@str=@str+','
FETCH PRIOR FROM field_cursor
------------------------------------------
我改了一下,我先让游标移到下一行,如果无记录了,则...,然后再移到前一行.
xluzhong 2005-03-26
  • 打赏
  • 举报
回复

访问和更改关系数据


提取和滚动
从游标中检索行的操作称为提取。提取选项如下:

FETCH FIRST
提取游标中的第一行。

FETCH NEXT
提取上次提取行之后的行。

FETCH PRIOR
提取上次提取行之前的行。

FETCH LAST
提取游标中的最后一行。

FETCH ABSOLUTE n
如果 n 为正整数,则提取游标中从第 1 行开始的第 n 行。如果 n 为负整数,则提取游标中的倒数第 n 行。如果 n 为 0,则没有行被提取。

FETCH RELATIVE n
提取上次所提取行之后的第 n 行。如果 n 为正数,则提取所上次提取行之后的第 n 行。如果 n 为负数,则提取上次所提取行之前的第 n 行。如果 n 为 0,则同一行被再次提取。

打开游标时,游标中当前行的位置逻辑上应位于第一行之前。这使不同的提取选项具有下列行为,如果这是打开游标后的第一次提取操作:

FETCH FIRST
提取游标中的第一行。

FETCH NEXT
提取游标中的第一行。

FETCH PRIOR
不提取行。

FETCH LAST
提取游标中的最后一行。

FETCH ABSOLUTE n
如果 n 为正整数,则提取游标中从第 1 行开始的第 n 行。如果 n 为负整数,则提取游标中的倒数的第 n 行(例如,n = -1 返回游标中的最后一行)。如果 n 为 0,则没有行被提取。

FETCH RELATIVE n
如果 n 为正数,则提取游标中的第 n 行。如果 n 为负数或 0,则没有行被提取。

Transact-SQL 游标限于一次只能提取一行。API 服务器游标则支持每次提取时提取一批行。支持一次提取多行的游标称为块状游标。

游标分类
游标可以按照它所支持的提取选项进行分类:

只进
必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作。

可滚动性
可以在游标中任何地方随机提取任意行。允许所有的提取操作(但动态游标不支持绝对提取)。

可滚动游标对支持联机应用程序特别有用。可将游标映射为应用程序中的表格或列表框。随着用户向上、向下和在整个表格中滚动,应用程序使用滚动提取从游标中检索用户想要查看的行。

用 API 提取行
实际使用的语句、函数或方法的 API 都有不同的名称来提取行:

Transact-SQL 游标使用 FETCH FIRST、FETCH LAST、FETCH NEXT、FETCH PRIOR、FETCH ABSOLUTE(n) 和 FETCH RELATIVE(n) 语句。


OLE DB 使用如下方法:IRowset::GetNextRows、IRowsetLocate::GetRowsAt、IRowsetLocate::GetRowsAtBookmark 和 IRowsetScroll::GetRowsAtRatio。


ODBC 使用 SQLFetch 函数,它与用于一行的 FETCH NEXT 或 SQLFetchScroll 相同。SQLFetchScroll 支持块状游标和所有的提取选项(第一、最后、下一个、前一个、绝对、相对)。


ADO 使用 Move、MoveFirst、MoveLast、MoveNext 和 MovePrevious Recordset 方法获取游标的位置。然后使用 GetRows 记录集方法在那个位置检索一行或多行。也可直接调用 GetRows,将其中的 Start 参数设为想要提取的行数。


DB-Library 使用 dbcursorfetch 和 dbcursorfetchex 函数。
fly29 2005-03-26
  • 打赏
  • 举报
回复
主要是用来从个表中取出所有表名,和此表下所有字段名,字段类型,字段长度,是否为主键,是否为空.来批量建表.
fly29 2005-03-26
  • 打赏
  • 举报
回复
我写的:
-----------
--建表存储过程
create procedure CreateTable
as

SET NOCOUNT ON --取消返回执行语句影响行数
--声明一个游标
declare @tablename varchar(50) --表名
declare @fieldname varchar(50) --字段名
declare @fieldtype varchar(50) --字段类型
declare @isnullstr varchar(10) --是否为空
declare @fildlength varchar(20) --字段长度
declare @iskey varchar(10)
declare @str varchar(200)

declare table_cursor CURSOR for
select DISTINCT(表名) from tables
OPEN table_cursor
FETCH NEXT from table_cursor INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
declare field_cursor CURSOR for
select 字段名,字段类型,字段长度,是否为空,是否为主键 from TABLE_TEMP where 表名=@tablename
OPEN field_cursor
FETCH NEXT from field_cursor INTO @fieldname,@fieldtype,@fieldlength,@isnullstr,@iskey
WHILE @@FETCH_STATUS = 0
BEGIN
--创建字段列表字串
@str = @str + @fieldname +''+ @fieldtype +'(' +@fieldlength +')'
if @isnullstr =0
BEGIN
@str=@str + 'not null'
END
if @iskey =1
BEGIN
@str=@str + 'INDENTITY(1,1) PRIMARY KEY CLUSTERED'
END
--如果游标到了最后一条记录 ????????????
if (@@FETCH NEXT from field_cursor ) = -1
@str=@str+''
else
@str=@str+','

FETCH NEXT from field_cursor INTO @fieldname,@fieldtype,@fieldlength,@isnullstr,@iskey
END
--创建表
exec SP_EXECUTESQL("create table "+@tablename+ "(" +@str + ")")

CLOSE Field_cursor --关闭游标
DEALLOCATE field_cursor --删除游标

FETCH NEXT from table_cursor INTO @tablename
END
CLOSE table_cursor
DEALLOCATE table_cursor
fly29 2005-03-26
  • 打赏
  • 举报
回复
@@FETCH_STATUS = 0 是用来判断当前游标是不是指向一条记录,是否成功.
我想判断当前游标是否指向了最后一条记录...
xluzhong 2005-03-26
  • 打赏
  • 举报
回复
WHILE @@FETCH_STATUS = 0

-----

@@FETCH_STATUS 把游标的该值用其他区变量表示

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧