• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
无忧岛主
实践是检验真理的唯一标准
博客园    首页    新随笔       管理    订阅  订阅
sql循环-游标、临时表、表变量

 游标

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

-- 声明变量
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;

临时表

-- 创建临时表
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
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;

表变量

-- 声明表变量
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

来源:https://www.cnblogs.com/cnki/p/10349684.html

如果本文引用了你的文章而未注明,请及时联系我。
posted on 2019-06-14 15:13  无忧岛主  阅读(739)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3