游标

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

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

SQL Server循环——游标、表变量、临时表的更多相关文章

  1. SQL Server 2014,表变量上的非聚集索引

    从Paul White的推特上看到,在SQL Server 2014里,对于表变量(Table Variables),它是支持非唯一聚集索引(Non-Unique Clustered Indexes) ...

  2. Sql Server RowNumber和表变量分页性能优化小计

    直接让代码了,对比看看就了解了 当然,这种情况比较适合提取字段较多的情况,要酌情而定 性能较差的: WITH #temp AS                       (              ...

  3. 在SQL SERVER中获取表中的第二条数据

    在SQL SERVER中获取表中的第二条数据, 思路:先根据时间逆排序取出前2条数据作为一个临时表,再按顺时排序在临时表中取出第一条数据 sql语句如下: select top 1 * from(se ...

  4. 显示 Sql Server 中所有表或表中行的信息

    在MSSQL中显示某个数据库中所有表或视图的信息: (以下语句为获取所有表信息,将绿色字"U"替换为"V"则获取所有视图信息.) SELECT sysobjec ...

  5. 查询sql server 2008所有表和行数

    查询sql server 2008所有表和行数 SELECT a.name, b.rows FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.i ...

  6. SQL server 数据库用户表名称

    转自(http://blog.163.com/jlj_sk/blog/static/22579293200861422833924/) 取得SQL server 数据库中 所有用户表名称 select ...

  7. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  8. SQL Server 2014,改善的临时表缓存

    在一些先决条件下,SQL Server可以缓存临时表(cache Temp Tables).缓存临时表意味着当你创建反复创建同个临时表时,SQL Server就可以重用它们.这会从整体上大幅度提高你的 ...

  9. 快速查看SQL Server 中各表的数据量以及占用空间大小

    快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...

随机推荐

  1. 【CF865D】Buy Low Sell High(贪心)

    [CF865D]Buy Low Sell High(贪心) 题面 洛谷 CF 题解 首先有一个\(O(n^2)\)的\(dp\)很显然,设\(f[i][j]\)表示前\(i\)天手中还有\(j\)股股 ...

  2. [AH2017/HNOI2017]礼物(FFT)

    题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一 ...

  3. poj2083 Fractal

    我一开始的想法是间断性的输出空格和solve(k-1) 但是发现问题很大. 雨菲:可以用一个数组保存啊 我:那不爆了? 雨菲:不会爆. 我一算:729 × 729,还真没爆. 然后就直接WA了.... ...

  4. A1114. Family Property

    This time, you are supposed to help us collect the data for family-owned property. Given each person ...

  5. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  6. Ubuntu下添加Samba用户名与密码

    参考: ubuntu下的Samba配置:使每个用户可以用自己的用户名和密码登录自己的home目录 增加samba用户提示Failed to add entry for user Ubuntu可以直接在 ...

  7. 动态样式语言—LESS基础知识

    CSS是一门非程序式语言,缺少逻辑性,不便于维护 LESS在CSS现有语法的基础上,为CSS加入程序式语言的特性 引入了变量.混入.运算.函数等功能,大大简化CSS的编写,降低了CSS的维护成本 LE ...

  8. please select android sdk

  9. qml: 以鼠标为中心进行放缩;

    import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.2 Window { visible: true widt ...

  10. 常用的一些cmd命令

    常用的一些cmd命令总结 ----------- 1.ping主机名字,类似于ping机子的IP地址 2.查看当前用户的dos命令 3.查看机器名 调出计算器命令:calc 调出远程桌面的命令:mst ...