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
  • 相关阅读:
    在meshLab的3D场景中绘制2D透明信息面板
    The Joint ISPRS Workshop on 3D City Modelling & Applications and the 6th 3D GeoInfo Conference
    shader概述
    QString和string互转中文字符
    virtualBox中安装Mac
    可视化排序(插入/选择/冒泡/快速/归并/Shell)
    PointCloud(2) procesing in ROS(PCL)
    蛋疼的回车换行(CR/LF)
    使用ItemData为树节点关联某个对象指针
    博客园标签云
  • 原文地址:https://www.cnblogs.com/cnki/p/10349684.html
Copyright © 2011-2022 走看看