我看过许多关于SQL Server游标方面的文章,大部分都对它抱怨连连。我也不例外,真希望SQL Server从来没有引入这样一个功能。但是事实已然这样,抱怨是无济于事的。游标造成的问题有很多,比如延长锁问题,无法缓存执行计划以及加大内存与CPU开销问题等。
许多T-SQL程序员和DBA都不知道如何不使用游标而成功记录循环。在本文中,我将分享一些不使用游标而实现循环功能的方法。 方法一:带有标识列的临时表 在这一方法中,我们将使用带有标识列的临时表,它允许逐行选择。如果你执行一个INSERT/UPDATE/DELETE命令,要确保使用显式事务。
在每次循环交付时,这将极大地减少你的日志文件……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
我看过许多关于SQL Server游标方面的文章,大部分都对它抱怨连连。我也不例外,真希望SQL Server从来没有引入这样一个功能。但是事实已然这样,抱怨是无济于事的。游标造成的问题有很多,比如延长锁问题,无法缓存执行计划以及加大内存与CPU开销问题等。许多T-SQL程序员和DBA都不知道如何不使用游标而成功记录循环。在本文中,我将分享一些不使用游标而实现循环功能的方法。
方法一:带有标识列的临时表
在这一方法中,我们将使用带有标识列的临时表,它允许逐行选择。如果你执行一个INSERT/UPDATE/DELETE命令,要确保使用显式事务。在每次循环交付时,这将极大地减少你的日志文件负载,并且在失败时阻止了大量的回滚。
set nocount on declare @i int --iterator declare @iRwCnt int --rowcount declare @sValue varchar(100) set @i = 1 --initialize create table #tbl(ID int identity(1,1), Value varchar(100)) insert into #tbl(Value) select name from master..sysdatabases (nolock) set @iRwCnt = @@ROWCOUNT --SCOPE_IDENTITY() would also work create clustered index idx_tmp on #tbl(ID) WITH FILLFACTOR = 100 /* |
每次执行插入都要进行此操作,因为批量添加索引总比每次写入临时表时更新索引要快。既然你已知道列中的数据,你可以将填充因子设置为100%以获取最佳的读取时间。
*/ while @i <= @iRwCnt begin select @sValue = Value from #tbl where ID = @i --begin tran print 'My Value is ' + @sValue --replace with your operations on this value --commit tran set @i = @i + 1 end drop table #tbl |
作者
Matt在SQL Server和Oracle这两个领域具有12年的经验。他获得微软MCITP认证、是一名数据库开发人员,他还获得了计算机科学专业硕士学位是SQL Server数据库系统高级软件工程师,范围从2 GB到3+ TB、2k和40+ktrans/sec之间。目前他任职于IGT公司,同样是一名独立的咨询师、专攻覆盖自动化、电子商务、娱乐和银行业的SQL Server、Oracle以及.NET方面。Matt擅长OLTP/OLAP数据库管理系统以及用.NET语言写可升级的处理系统。
翻译
相关推荐
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。
-
如何在Azure部署时选择合适的SQL Server?
想要在Azure上运行SQL Server,企业一般会面临两种选择:在Azure虚拟机上安装SQL Server或使用Azure SQL Database。
-
Linux支持的引入 推动了SQL Server 2016集成服务的发展
随着SQL Server的不断发展,集成服务也在发生相应的变化。在最新的SSIS更新中,增加Linux支持和SQL Server 2016升级向导。