• SQL內置Function游标函数


    游标函数

    这些标量函数返回有关游标的信息。

    @@CURSOR_ROWS

    CURSOR_STATUS

    @@FETCH_STATUS

    所有游标函数都不具有确定性。每次用一组特定输入值调用它们时,返回的结果不总是相同的。有关函数确定性的更多信息,请参见确定性函数和非确定性函数。

    1@@CURSOR_ROWS

    返回连接上最后打开的游标中当前存在的合格行的数量。为提高性能,Microsoft® SQL Server™ 可以异步填充大键集和静态游标。可调用 @@CURSOR_ROWS,以确定当它被调用时,符合游标的行的数目被进行了检索。

    返回值

    描述

    -m

    游标被异步填充。返回值 (-m) 是键集中当前的行数。

    -1

    游标为动态。因为动态游标可反映所有更改,所以符合游标的行数不断变化。因而永远不能确定地说所有符合条件的行均已检索到。

    0

    没有被打开的游标,没有符合最后打开的游标的行,或最后打开的游标已被关闭或被释放。

    n

    游标已完全填充。返回值 (n) 是在游标中的总行数。

     

    语法

    @@CURSOR_ROWS

    返回类型

    integer

    注释

    若最后打开的游标是异步打开的,则 @@CURSOR_ROWS 返回的值是负数。若 sp_configure cursor threshold 的值大于0,则键集驱动程序或静态游标被异步打开,且游标结果集中的行数大于游标阈值。

    示例

    下面的示例声明了一个游标,并且用 SELECT 显示 @@CURSOR_ROWS 的值。在游标打开前,设置值为 0,值 -1 则表示游标键集被异步填充。

    SELECT @@CURSOR_ROWS
    DECLARE authors_cursor CURSOR FOR
    SELECT au_lname FROM authors
    OPEN authors_cursor
    FETCH NEXT FROM authors_cursor
    SELECT @@CURSOR_ROWS
    CLOSE authors_cursor
    DEALLOCATE authors_cursor
     
    ----------- 
    0           
     
    (1 row(s) affected)
     
    au_lname                                 
    ---------------------------------------- 
    White                                    
     
    (1 row(s) affected)
     
                
    ----------- 
    -1          
     
    (1 row(s) affected)

     

    2CURSOR_STATUS

    这是一个标量函数,该函数允许存储过程的调用方确定针对一个给定参数,该过程是否返回游标和结果集。

    语法

    CURSOR_STATUS
        (
            { 'local' , 'cursor_name' }
            | { 'global' , 'cursor_name' }
            | { 'variable' , 'cursor_variable' }
        )

    参数

    'local'

    指定一个常量,该常量表明游标的源是一个本地游标名。

    'cursor_name'

    游标名。游标名必须符合标识符的规则。

    'global'

    指定一个常量,该常量表明游标的源是一个全局游标名。

    'variable'

    指定一个常量,该常量表明游标的源是一个本地变量。

    'cursor_variable'

    游标变量的名称。必须使用 cursor 数据类型定义游标变量。

    返回类型

    smallint

    返回值


    游标名


    游标变量

    1

    游标的结果集至少有一行,并且:

    对于不感知游标和键集游标,结果集至少有一行。

    对于动态游标,结果集可以有零行、一行或多行。

    分配给该变量的游标已经打开,并且:

    对于不感知游标和键集游标,结果集至少有一行。

    对于动态游标,结果集可以有零行、一行或多行。

    0

    游标的结果集为空。*

    分配给该变量的游标已经打开,然而结果集肯定为空。*

    -1

    游标被关闭。

    分配给该变量的游标被关闭。

    -2

    不可用。

    可以是:

    先前调用的过程并没有将游标指派给 OUTPUT 变量。

    先前调用的过程给 OUTPUT 变量指派了游标,然而在过程结束时,游标处于关闭状态。因此,游标被释放,并且没有返回给调用过程。

    没有将游标指派给已声明的游标变量。

    -3

    带有指定名称的游标不存在。

    带有指定名称的游标变量并不存在,或者即使存在这样一个游标变量,但并没有给它分配游标。

     

    * 动态游标从不返回这个结果。

    示例

    下面的示例创建一个名为 lake_list 的过程,并将执行 lake_list 的输出结果用作 CURSOR_STATUS 的检验。

    说明  本示例依赖于一个名为 check_authority 的过程,该过程尚未创建。

    USE pubs
    IF EXISTS (SELECT name FROM sysobjects
          WHERE name = 'lake_list' AND type = 'P')
       DROP PROCEDURE lake_list
    GO
    CREATE PROCEDURE lake_list
       ( @region varchar(30),
         @size integer,
         @lake_list_cursor CURSOR VARYING OUTPUT )
    AS 
    BEGIN
       DECLARE @ok SMALLINT
       EXECUTE check_authority @region, username, @ok OUTPUT
       IF @ok = 1
          BEGIN
          SET @lake_list_cursor =CURSOR LOCAL SCROLL FOR
             SELECT name, lat, long, size, boat_launch, cost
             FROM lake_inventory
             WHERE locale = @region AND area >= @size
             ORDER BY name
          OPEN @lake_list_cursor
          END
    END
    DECLARE @my_lakes_cursor CURSOR
    DECLARE @my_region char(30)
    SET @my_region = 'Northern Ontario'
    EXECUTE lake_list @my_region, 500, @my_lakes_cursor OUTPUT
    IF Cursor_Status('variable', '@my_lakes_cursor') <= 0
       BEGIN
       /* Some code to tell the user that there is no list of
       lakes for him/her */
       END
    ELSE
       BEGIN
          FETCH @my_lakes_cursor INTO -- Destination here
          -- Continue with other code here.
    END

    3@@FETCH_STATUS

    返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。

    返回值

    描述

    0

    FETCH 语句成功。

    -1

    FETCH 语句失败或此行不在结果集中。

    -2

    被提取的行不存在。

     

    语法

    @@FETCH_STATUS

    返回类型

    integer

    注释

    由于 @@FETCH_STATUS 对于在一个连接上的所有游标是全局性的,要小心使用 @@FETCH_STATUS 。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS 。在任何提取操作出现在此连接上前,@@FETCH_STATUS 的值没有定义。

    例如,用户从一个游标执行一条 FETCH 语句,然后调用一个存储过程,此存储过程打开并处理另一个游标的结果。当控制从被调用的存储过程返回后,@@FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果,而不是在存储过程被调用之前的 FETCH 语句的结果。

    示例

    下面的示例用 @@FETCH_STATUS 控制在一个 WHILE 循环中的游标活动。

    DECLARE Employee_Cursor CURSOR FOR
    SELECT LastName, FirstName FROM Northwind.dbo.Employees
    OPEN Employee_Cursor
    FETCH NEXT FROM Employee_Cursor
    WHILE @@FETCH_STATUS = 0
    BEGIN
       FETCH NEXT FROM Employee_Cursor
    END
    CLOSE Employee_Cursor
    DEALLOCATE Employee_Cursor
     

     

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    浅析全球电信运营商排名
    《时空骇客》中的远距传物理论和虫洞理论
    优秀的商业计划书一定会“动”
    手机搜索的商业模式
    手机网游排行榜
    手机按键对应表
    "Avatar模式"透析
    百度数据暗示无线互联网将以个人为中心
    一种精神致加西亚的信
    手机定位技术将成社交网络催化剂
  • 原文地址:https://www.cnblogs.com/Athrun/p/556578.html
Copyright © 2020-2023  润新知