declare 游标名 cursor for select sex,lno from peoplename order by lno for update of 要更新的列名

解决方案 »

  1.   

    SQL2000的模板
    -- =============================================
    -- Declare and using an UPDATE cursor
    -- =============================================
    DECLARE <@variable_1, sysname, @v1> <datatype_for_variable_1, sysname, varchar(20)>, 
    <@variable_2, sysname, @v2> <datatype_for_variable_2, sysname, varchar(40)>DECLARE <cursor_name, sysname, test_cursor> CURSOR 
    FOR SELECT <column_1, sysname, au_fname>, <column_2, sysname, au_lname> FROM <table_name, sysname, pubs.dbo.authors>
    FOR UPDATE of <column_1, sysname, au_fname>DECLARE @count smallint
    SELECT @count = 1OPEN <cursor_name, sysname, test_cursor>
    FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO <@variable_1, sysname, @v1>, <@variable_2, sysname, @v2>WHILE (@@fetch_status <> -1)
    BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
    -- PRINT 'add user-defined code here...'
    -- eg
    PRINT 'updating record of ' + @v1 + ' ' + @v2
    UPDATE pubs.dbo.authors
    SET au_fname = @v1 + '-' + CAST(@count AS varchar(4))
    WHERE au_lname = @v2
    END
    FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO <@variable_1, sysname, @v1>, <@variable_2, sysname, @v2>
    SELECT @count = @count + 1
    ENDCLOSE <cursor_name, sysname, test_cursor>
    DEALLOCATE <cursor_name, sysname, test_cursor>
    GO
      

  2.   

    declare hCursor cursor global dynamic for select itemno,samno from shi order by itemno  for update of samno
    伺服器: 訊息 16957,層級 16,狀態 4,程序 cs_AutoCode,行 5
    FOR UPDATE 不可指定於 READ ONLY 資料指標 (Cursor)。
      

  3.   

    DECLARE CURSOR
    定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。DECLARE CURSOR 接受基于 SQL-92 标准的语法和使用一组 Transact-SQL 扩展的语法。SQL-92 语法
    DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR 
    FOR select_statement 
    [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]Transact-SQL 扩展语法
    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 ] ] ]SQL-92 参数
    cursor_name是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息,请参见使用标识符。INSENSITIVE定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,(任何用户)对基表提交的删除和更新都反映在后面的提取中。SCROLL指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果指定 SCROLL,则不能也指定 FAST_FORWARD。select_statement是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。如果 select_statement 中的子句与所请求的游标类型的功能发生冲突,则 Microsoft&reg; SQL Server&#8482; 隐性地将游标转换为另一种类型。有关更多信息,请参见隐性游标转换。READ ONLYPrevents updates made through this cursor.在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。UPDATE [OF column_name [,...n]]定义游标内可更新的列。如果指定 OF column_name [,...n] 参数,则只允许修改所列出的列。如果在 UPDATE 中未指定列的列表,则可以更新所有列。Transact-SQL 扩展参数
    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 早期版本中所有游标都是全局的。该选项的默认值在以后的 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。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一个,则不能指定另一个。STATIC定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。KEYSET指定当游标打开时,游标中行的成员资格和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。对基表中的非键值所做的更改(由游标所有者更改或由其它用户提交)在用户滚动游标时是可视的。其他用户进行的插入是不可视的(不能通过 Transact-SQL 服务器游标进行插入)。如果某行已删除,则对该行的提取操作将返回 @@FETCH_STATUS 值 -2。从游标外更新键值类似于删除旧行后接着插入新行的操作。含有新值的行不可视,对含有旧值的行的提取操作将返回 @@FETCH_STATUS 值 -2。如果通过指定 WHERE CURRENT OF 子句用游标完成更新,则新值可视。DYNAMIC定义一个游标,以反映在滚动游标时对结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持 ABSOLUTE 提取选项。FAST_FORWARD指定启用了性能优化的 FORWARD_ONLY、READ_ONLY 游标。如果指定 FAST_FORWARD,则不能也指定 SCROLL 或 FOR_UPDATE。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一个,则不能指定另一个。READ_ONLY禁止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。SCROLL_LOCKS指定确保通过游标完成的定位更新或定位删除可以成功。当将行读入游标以确保它们可用于以后的修改时,Microsoft&reg; SQL Server&#8482; 会锁定这些行。如果还指定了 FAST_FORWARD,则不能指定 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。如果 select_statement 内的子句与所请求的游标类型冲突,SQL Server 将游标隐性转换成另一种类型。有关更多信息,请参见隐性游标转换。UPDATE [OF column_name [,...n]]定义游标内可更新的列。如果提供了 OF column_name [,...n],则只允许修改列出的列。如果在 UPDATE 中未指定列的列表,除非指定了 READ_ONLY 并发选项,否则所有列均可更新
      

  4.   

    DYNAMIC 和 KEYSET 游标默认为 OPTIMISTIC。 
    OPTIMISTIC
    指定如果行自从被读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时 SQL Server 不锁定行。相反,SQL Server 使用 timestamp 列值的比较,或者如果表没有 timestamp 列则使用校验值,以确定将行读入游标后是否已修改该行。如果已修改该行,尝试进行的定位更新或定位删除将失败。如果还指定了 FAST_FORWARD,则不能指定 OPTIMISTIC。
      

  5.   

    呵呵.樓上的貼出來的我在msdn里也看到了呀.你看我上面的代碼有沒有問題.
      

  6.   

    CREATE PROCEDURE [dbo].[cs_AutoCode] AS
    declare @szItem varchar(13),@szSamno varchar(8)
    declare @iCounter int
    set @iCounter=1
    declare hCursor cursor global dynamic for select itemno,samno from shi order by itemno for update of samno
      

  7.   

    CREATE PROCEDURE [dbo].[cs_AutoCode] AS
    declare @szItem varchar(13),@szSamno varchar(8)
    declare @iCounter int
    set @iCounter=1
    declare hCursor cursor global for select itemno,samno from shi order by itemno for update of samno
      

  8.   

    可以,但后面一定要跟上你要UPDATE的列名.
      

  9.   

    奇怪.可能是我的sql有問題.就是不能加update
      

  10.   

    為什麼去掉order by 就可以呢