游标

在存储过程或触发器中使用 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



原文地址:https://www.cnblogs.com/jes_shaw/p/2004271.html