zoukankan      html  css  js  c++  java
  • SQL Server循环——游标、表变量、临时表

     游标

    在游标逐行处理过程中,当需要处理的记录数较大,而且游标处理位于数据库事务内时,速度非常慢。

    -- 声明变量
    DECLARE @Id AS Int
    -- 声明游标
    DECLARE C_Id CURSOR FAST_FORWARD READ_ONLY FOR
        SELECT  b.Id FROM  dbo.Books b;
    -- 打开游标
    OPEN C_Id;
    
    -- 取第一条记录
    FETCH NEXT FROM C_Id INTO @Id;
    WHILE @@FETCH_STATUS = 0
        BEGIN
        --逻辑处理
            SELECT  *  FROM  dbo.Books WHERE Id = @Id;
       -- 取下一条记录
            FETCH NEXT FROM C_Id INTO @Id;
        END;
    -- 关闭游标
    CLOSE C_Id;
    -- 释放游标
    DEALLOCATE C_Id;
    View Code

    临时表

    -- 创建临时表
    IF OBJECT_ID('tempdb.dbo.#tempBooks','U') IS NOT NULL DROP TABLE dbo.#tempBooks;
    GO
    
    SELECT Id 
    INTO dbo.#tempBooks
    FROM  dbo.Books b
    
    DECLARE
      @Id Int
        
    WHILE EXISTS(SELECT Id FROM dbo.#tempBooks)
    BEGIN
        -- 也可以使用top 1
        SET ROWCOUNT 1
    
        --逻辑处理
        SELECT @Id=Id FROM dbo.#tempBooks;
        SELECT  *  FROM  dbo.Books WHERE Id = @Id;
    
        SET ROWCOUNT 0
        -- 删除临时表
        DELETE FROM dbo.#tempBooks WHERE Id=@Id;
    END
    View Code
    DECLARE @intMinId INT ,
        @intMaxId INT;
    
    SELECT  RowID = IDENTITY( INT,1,1)--使用identity(int,1,1)来产生行号,必须把数据插入到一张表中。
    INTO    #templist
    FROM    dbo.Books;
    
    SELECT  @intMinId = MIN(RowID) ,
            @intMaxId = MAX(RowID)
    FROM    dbo.#templist;
    
    WHILE @intMinId <= @intMaxId
        BEGIN
            PRINT @intMinId;
            SET @intMinId = @intMinId + 1;
        END;
    DROP TABLE dbo.#templist;
    View Code

     表变量

    -- 声明表变量
    DECLARE @tempBooks TABLE
    (
         Id Int
    );
    
    -- 将源表中的数据插入到表变量中
    INSERT INTO @tempBooks(Id)
    SELECT Id  FROM dbo.Books
    -- 声明变量
    DECLARE
       @Id Int
        
    WHILE EXISTS(SELECT Id FROM @tempBooks)
    BEGIN
        -- 也可以使用top 1
        SET ROWCOUNT 1
        
        --逻辑处理
        SELECT @Id = Id FROM @tempBooks;
        SELECT  *  FROM  dbo.Books WHERE Id = @Id;
    
        SET ROWCOUNT 0
    
        DELETE FROM @tempBooks WHERE Id = @Id;
    END
    View Code
  • 相关阅读:
    Shiro笔记(三)shiroFilter拦截器配置原则
    Shiro笔记(二)Shiro集成SpringMVC的环境配置
    Shiro笔记(一)Shiro整体介绍
    javaNIO的总结
    Redis的工作流程
    Nginx的配置安装和使用
    Linux下java开发环境配置总结
    php 基础知识 post 和get 两种传输方式的区别
    php 高级 多台web服务器共享session的方法
    php 基础知识 SESSION 和 COOKIE 的区别
  • 原文地址:https://www.cnblogs.com/cnki/p/10349684.html
Copyright © 2011-2022 走看看