游标

在存储过程或触发器中使用 Transact-SQL 游标的典型过程为:

  1. 声明 Transact-SQL 变量包含游标返回的数据。为每个结果集列声明一个变量。声明足够大的变量来保存列返回的值,并声明变量的类型为可从列数据类型隐式转换得到的数据类型。
  2. 使用 DECLARE CURSOR 语句将 Transact-SQL 游标与 SELECT 语句相关联。另外,DECLARE CURSOR 语句还定义游标的特性,例如游标名称以及游标是只读还是只进。
  3. 使用 OPEN 语句执行 SELECT 语句并填充游标。
  4. 使用 FETCH INTO 语句提取单个行,并将每列中的数据移至指定的变量中。然后,其他 Transact-SQL 语句可以引用那些变量来访问提取的数据值。Transact-SQL 游标不支持提取行块。
  5. 使用 CLOSE 语句结束游标的使用。关闭游标可以释放某些资源,例如游标结果集及其对当前行的锁定,但如果重新发出一个 OPEN 语句,则该游标结构仍可用于处理。由于游标仍然存在,此时还不能重新使用该游标的名称。DEALLOCATE 语句则完全释放分配给游标的资源,包括游标名称。释放游标后,必须使用 DECLARE 语句来重新生成游标。
    -- ---------------------------------------------------
    /*
     Use DECLARE @local_variable, DECLARE CURSOR and SET.  */
    USE  AdventureWorks
    GO

    DECLARE   @MyVariable   CURSOR

    DECLARE  MyCursor  CURSOR   FOR
    SELECT  LastName  FROM  AdventureWorks.Person.Contact

    SET   @MyVariable   =  MyCursor
    GO
    /*  Use DECLARE @local_variable and SET  */
    DECLARE   @MyVariable   CURSOR

    SET   @MyVariable   =   CURSOR  SCROLL KEYSET  FOR
    SELECT  LastName  FROM  AdventureWorks.Person.Contact;
    DEALLOCATE  MyCursor;
    -- ---------------------------------------------------
    USE  AdventureWorks
    GO
    --  Declare the variables to store the values returned by FETCH.
    DECLARE   @LastName   varchar ( 50 ),  @FirstName   varchar ( 50 )

    DECLARE  contact_cursor  CURSOR   FOR
    SELECT  LastName, FirstName  FROM  Person.Contact
    WHERE  LastName  LIKE   ' B% '
    ORDER   BY  LastName, FirstName

    OPEN  contact_cursor

    --  Perform the first fetch and store the values in variables.
    --
     Note: The variables are in the same order as the columns
    --
     in the SELECT statement. 

    FETCH   NEXT   FROM  contact_cursor
    INTO   @LastName @FirstName

    --  Check @@FETCH_STATUS to see if there are any more rows to fetch.
    WHILE   @@FETCH_STATUS   =   0
    BEGIN

       
    --  Concatenate and display the current values in the variables.
        PRINT   ' Contact Name:  '   +   @FirstName   +   '   '   +    @LastName

       
    --  This is executed as long as the previous fetch succeeds.
        FETCH   NEXT   FROM  contact_cursor
       
    INTO   @LastName @FirstName
    END

    CLOSE  contact_cursor
    DEALLOCATE  contact_cursor
    GO



你可能感兴趣的:(游标)