zoukankan      html  css  js  c++  java
  • FETCH (TransactSQL)

    代码
    FETCH (Transact-SQL)

    通过 Transact
    -SQL 服务器游标检索特定行。

    Transact
    -SQL 语法约定

    语法

    FETCH
    [ [ NEXT | PRIOR | FIRST | LAST
    | ABSOLUTE { n | @nvar }
    | RELATIVE { n | @nvar }
    ]
    FROM
    ]
    { {
    [ GLOBAL ] cursor_name } | @cursor_variable_name }
    [ INTO @variable_name [ ,...n ] ] 参数
    NEXT
    紧跟当前行返回结果行,并且当前行递增为返回行。如果
    FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。

    PRIOR
    返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果
    FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。

    FIRST
    返回游标中的第一行并将其作为当前行。

    LAST
    返回游标中的最后一行并将其作为当前行。

    ABSOLUTE { n
    | @nvar}
    如果 n 或
    @nvar 为正,则返回从游标头开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为负,则返回从游标末尾开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar0,则不返回行。n 必须是整数常量,并且 @nvar 的数据类型必须为 smallinttinyintint

    RELATIVE { n
    | @nvar}
    如果 n 或
    @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar0,则返回当前行。在对游标进行第一次提取时,如果在将 n 或 @nvar 设置为负数或 0 的情况下指定 FETCH RELATIVE,则不返回行。n 必须是整数常量,@nvar 的数据类型必须为 smallinttinyintint

    GLOBAL
    指定 cursor_name 是指全局游标。

    cursor_name
    要从中进行提取的打开的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为它们的名称,那么指定 GLOBAL 时,cursor_name 指的是全局游标;未指定 GLOBAL 时,cursor_name 指的是局部游标。

    @ cursor_variable_name
    游标变量名,引用要从中进行提取操作的打开的游标。

    INTO @variable_name[ ,...n]
    允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。变量的数目必须与游标选择列表中的列数一致。

    备注
    如果 SCROLL 选项未在 ISO 样式的
    DECLARE CURSOR 语句中指定,则 NEXT 是唯一支持的 FETCH 选项。如果在 ISO 样式的 DECLARE CURSOR 语句中指定了 SCROLL 选项,则支持所有 FETCH 选项。

    如果使用 Transact
    -SQL DECLARE 游标扩展插件,则应用下列规则:

    如果指定了 FORWARD_ONLY 或 FAST_FORWARD,则
    NEXT 是唯一受支持的 FETCH 选项。

    如果未指定 DYNAMIC、FORWARD_ONLY 或 FAST_FORWARD 选项,并且指定了 KEYSET、STATIC 或 SCROLL 中的某一个,则支持所有
    FETCH 选项。

    DYNAMIC SCROLL 游标支持除 ABSOLUTE 以外的所有
    FETCH 选项。

    @@FETCH_STATUS 函数报告上一个 FETCH 语句的状态。相同的信息记录在由 sp_describe_cursor 返回的游标中的 fetch_status 列中。这些状态信息应该用于在对由 FETCH 语句返回的数据进行任何操作之前,以确定这些数据的有效性。有关详细信息,请参阅 @@FETCH_STATUS (Transact-SQL)。

    权限
    FETCH 权限默认授予任何有效的用户。

    示例
    A. 在简单的游标中使用
    FETCH
    以下示例为 Person.Contact 表中姓氏以字母 B 开头的行声明了一个简单的游标,并使用
    FETCH NEXT 逐个提取这些行。FETCH 语句以单行结果集形式返回在 DECLARE CURSOR 中指定的列的值。

    复制代码
    USE AdventureWorks
    GO
    DECLARE contact_cursor CURSOR FOR
    SELECT LastName FROM Person.Contact
    WHERE LastName LIKE 'B%'
    ORDER BY LastName

    OPEN contact_cursor

    -- Perform the first fetch.
    FETCH NEXT FROM contact_cursor

    -- Check @@FETCH_STATUS to see if there are any more rows to fetch.
    WHILE @@FETCH_STATUS = 0
    BEGIN
    -- This is executed as long as the previous fetch succeeds.
    FETCH NEXT FROM contact_cursor
    END

    CLOSE contact_cursor
    DEALLOCATE contact_cursor
    GOB. 使用
    FETCH 将值存入变量
    以下示例与示例 A 相似,但
    FETCH 语句的输出存储于局部变量而不是直接返回到客户端。PRINT 语句将变量组合成单一字符串并将其返回到客户端。

    复制代码
    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
    GOC. 声明 SCROLL 游标并使用其他
    FETCH 选项
    以下示例创建一个 SCROLL 游标,使其通过 LAST、PRIOR、RELATIVE 和 ABSOLUTE 选项支持全部滚动功能。


    现有表a,b
    在存储过程里想按a表的id往b表插入数据,但是a表里有多条记录
    a表:
    id name
    1 张三
    2 李四
    3 王五

    循环执行
    insert into b(title,content,aid) values(title,content,aid) 

    用游标:
    代码
    Create Procedure up_InsertData
    @ID INT
    AS
    BEGIN
    Declare @Name NVARCHAR(30)
    Declare tmpCur Cursor For Select [ID],[Name] From a WHERE [ID]=ISNULL(@ID,[ID])
    Open tmpCur
    Fetch Next From tmpCur Into @ID,@Name
    While @@Fetch_Status=0
    Begin
    insert into b(title,content,aid) values('','',@ID)
    Fetch Next From tmpCur Into @ID,@Name
    End
    Close tmpCur
    DealLocate tmpCur
    END

    EXEC up_InsertData 2
  • 相关阅读:
    继承
    redis面试题收集
    spring知识点
    jvm类加载
    jvm回收机制
    HashMap和ConcurrentHashMap
    java基础
    spring-quartz整合
    alibaba-sentinel-1.8变化
    springcloud执行流程理解图
  • 原文地址:https://www.cnblogs.com/MichaelZhangX/p/1941221.html
Copyright © 2011-2022 走看看