说明:一个带有update的循环的代码。很简单,但是在QQ群里问了,应该说是很少有人注意这个问题,也就是很少有人真的理解SQL中的Update。

代码如下:

if object_id('tempdb..#TB') is not null
drop table #TB
go --创建的是临时表
create table #TB
(
ID int
)
--插入5条记录
insert into #TB (ID)
select 1
union all
select 2
union all
select 3
union all
select 4
union all
select 5 --查看记录
select * from #TB
go --代码1
declare @i int
set @i = 1
while @i < 5
begin
update #TB set ID = ID,@i = @i + 1
select @i
end
go --代码2
declare @i int
set @i = 1
while @i < 5
begin
update #TB set ID = ID
set @i = @i + 1
select @i
end

从代码看无非就是建立了一个临时表,插入5条记录,然后代码1和代码2没有太大的差别,初次看见认为2次的循环都是4次,@i的结果应该都是5,如果你这么想,劝你还是把代码执行一遍吧,自己先想想,你的认为是错的。

正确的结果是:

代码1的循环次数1次,@i的结果6

代码2的循环次数4次,@i的结果5

看到这里,在好好的回去理解下代码,尤其是理解下update,然后再看后面的解释。

代码解释:

两端代码的区别无非是在update这一行,代码1将2条小语句写在一行上面,而代码2分两行写了,这就是问题的所在。

代码1执行分析:

@i=1

While(@i <5)

{

通过循环判断

执行update,因为Update是修改ID字段的记录,记录数5条,则Update这行的代码执行5次,所以@i = @i + 1也连带的执行5次,完毕后,@i=6

输出@i

循环判断(@i <5)false跳出

}

说以,代码1的循环次数为1,但是@i=6

代码2执行分析:

@i=1

While(@i <5)

{

通过循环判断

执行update,因为Update是修改ID字段的记录,记录数5条,则Update这行的代码执行5次,但是代码2该行没有@i = @i + 1所以完毕后,@i=1

@i = @i + 1,@i = 2

输出@i

循环判断(@i <5)true,再次执行循环,知道false

}

说以,代码2的循环次数为4,但是@i=5

参考引用:对于这种情况,我只能猜测是update本身的机制。对于代码1,每一条影响记录,那么便执行一次@i = @i + 1。所以在一次循环里面就执行了5次,达到了while的阀值,跳出循环。

参考文献:http://www.cnblogs.com/Gin-23333/p/4127453.html

SQL——神奇代码1之Update的更多相关文章

  1. SqlServer——神奇代码1之Update

    说明:一个带有update的循环的代码.很简单,但是在QQ群里问了,应该说是很少有人注意这个问题,也就是很少有人真的理解SQL中的Update. 代码如下: if object_id('tempdb. ...

  2. 判断字符串中是否有SQL攻击代码

    判断一个输入框中是否有SQL攻击代码 public const string SQLSTR2 = @"exec|cast|convert|set|insert|select|delete|u ...

  3. 转:Excel导入SQL数据库完整代码

    Excel导入SQL数据库完整代码 protected void studentload_Click(object sender, EventArgs e) {//批量添加学生信息 SqlConnec ...

  4. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  5. update值与原值相同时,SQL Server会真的去update还是忽略呢?

    原文:update值与原值相同时,SQL Server会真的去update还是忽略呢? 考虑下面的情况: 当update值与原值相同时,SQL Server会真的去update还是忽略?例如: upd ...

  6. Caused by: java.sql.SQLException: ResultSet is from UPDATE. No Data.

    1.错误描述 org.hibernate.exception.GenericJDBCException: error executing work at org.hibernate.exception ...

  7. SQL Server中Table字典数据的查询SQL示例代码

    SQL Server中Table字典数据的查询SQL示例代码 前言 在数据库系统原理与设计(第3版)教科书中这样写道: 数据库包含4类数据: 1.用户数据 2.元数据 3.索引 4.应用元数据 其中, ...

  8. java 连接mysql 和sql server2008代码

    这两天用java分别连接mysql和sql server2008代码.刚開始都是有错.如今找到了在 自己机器上成功连接的代码: 1. mysql Class.forName("com.mys ...

  9. java之java.sql.SQLException: ResultSet is from UPDATE. No Data.

    问题解释:java调用存储过程的时候,查询结果不能通过ResultSet来查询,需要通过CallableStatement来查询, 比如: ResultSet rs = callableStateme ...

随机推荐

  1. 循序渐进Python3(七) --1-- 面向对象

    Python 面向对象 什么是面向对象编程? 面向对象编程是一种程序设计范式 对现实世界建立对象模型 把程序看作不同对象的相互调用 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Py ...

  2. sql left join、right join、inner join

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  3. 分布式HBase-0.98.4环境搭建

    fesh个人实践,欢迎经验交流!Blog地址:http://www.cnblogs.com/fesh/p/3804072.html 本文有点简单,详细版本请参见<分布式Hbase-0.98.4在 ...

  4. js 获取 通过 ”?“ 或者 ”&“ url 传过来参数值

    请先 引用 jQuery的js <script> String.prototype.GetValue=function(para) { var reg = new RegExp(" ...

  5. 问题: ActivityManager: Warning: Activity not started, its current task has been brought to the front

    运行程序时看控制台有这样的错误,应用程序没跑起来. 解决办法:project-->Clean

  6. mac--mac杂记

    zsh路径补全.命令补全,命令参数补全,插件内容补全等等.触发补全只需要按一下或两下tab键,补全项可以使用ctrl+n/p/f/b上下左右切换. plugins=(git textmate ruby ...

  7. Java 基础知识总结 (二、基本数据类型)

    二.基本数据类型 java基本数据类型只能先声明后使用 boolean  true/false char 16-bit unicode character byte 8-bit integer sho ...

  8. AngularJS学习--- AngularJS中模板链接和图像 ng-src step6

    接上一篇文章,本文将主要介绍angularjs中的模板链接,和图像显示? 首先,切换分支,启动项目: git checkout step- npm start 1.效果 相较于前一篇文章,明显感觉多了 ...

  9. 剑指offer题目31-40

    面试题31:连续字数组的最大和 public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int len ...

  10. 咏南IOCP中间件

    咏南IOCP中间件 特大好消息,咏南中间件系列新增加——咏南IOCP中间件.咏南IOCP中间件完全兼容咏南DATASNAP中间件的远程方法接口. 中间件DELPHI7~DELPHI XE10.1.1都 ...