如题

解决方案 »

  1.   

    用在游标里,可以在帮助里找游标定义 declare cursor
      

  2.   

    KEYSET指定当游标打开时,游标中行的成员资格和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。对基表中的非键值所做的更改(由游标所有者更改或由其它用户提交)在用户滚动游标时是可视的。其他用户进行的插入是不可视的(不能通过 Transact-SQL 服务器游标进行插入)。如果某行已删除,则对该行的提取操作将返回 @@FETCH_STATUS 值 -2。从游标外更新键值类似于删除旧行后接着插入新行的操作。含有新值的行不可视,对含有旧值的行的提取操作将返回 @@FETCH_STATUS 值 -2。如果通过指定 WHERE CURRENT OF 子句用游标完成更新,则新值可视。
      

  3.   

    -- =============================================
    -- Declare and using a KEYSET cursor
    -- =============================================
    DECLARE <cursor_name, sysname, test_cursor> CURSOR
    KEYSET
    FOR <select_statement, , SELECT au_fname FROM pubs.dbo.authors>DECLARE @name varchar(40)OPEN <cursor_name, sysname, test_cursor>FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO @name
    WHILE (@@fetch_status <> -1)
    BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
    -- PRINT 'add user defined code here' 
    -- eg.
    PRINT 'updating record for ' + @name
    UPDATE pubs.dbo.authors 
    SET phone = replace(phone, ' ', '-')
    WHERE CURRENT OF <cursor_name, sysname, test_cursor>
    END
    FETCH NEXT FROM <cursor_name, sysname, test_cursor> INTO @name
    ENDCLOSE <cursor_name, sysname, test_cursor>
    DEALLOCATE <cursor_name, sysname, test_cursor>
    GO