说明:一个带有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

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

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

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

  2. SqlServer之代码块相关

    原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/sqlserver-codeblock/ 一.go语句 ...

  3. SQLServer之创建DML AFTER UPDATE触发器

    DML AFTER UPDATE触发器创建原理 触发器触发时,系统自动在内存中创建deleted表或inserted表,inserted表临时保存了插入或更新后的记录行,deleted表临时保存了删除 ...

  4. 两对整数明明完全一样,为何一个输出true,一个输出false?&&神奇代码(StrangeIntegerBehavior.java)输出诡异的结果,原因何在

    下面有一段代码: public class Main {     public static void main(String[] args) {                   Integer ...

  5. 总结oninput、onchange与onpropertychange事件的用法和区别 书写搜索的神奇代码

    总结oninput.onchange与onpropertychange事件的用法和区别 最近手机开发一个模糊搜索的功能组建,在网上就找到这篇文章! 前端页面开发的很多情况下都需要实时监听文本框输入,比 ...

  6. 对于JavaBean+Servlet+SqlServer的代码总结和打包调用

    日期:2019.3.24 博客期:049 星期日 说起来我已经说过很多次前台的应用技术了呢!这一次我是要将这一部分打包,做成配套的制作工具: 当前我已经打包成功,想要下载的同学可以进入我的GitHub ...

  7. sqlserver暂时禁用触发器进行update

    --1.禁用某个表上的所有触发器 ALTER TABLE tbname DISABLE TRIGGER all go --2.执行update语句 update tbname set .... go ...

  8. sqlServer自动代码提示功能

    第一种方法: 首先确认 自己的sqlServer2008自身的提示功能有没有被屏蔽了! 打开sqlserver2008 -- 工具 -- 选项 -- 文本编辑器 -- 所有语言 --  勾选 语句结束 ...

  9. 转 update关联更新在sqlserver和oracle中的实现

    sqlserver和oracle中实现update关联更新的语法不同,都可以通过inline view(内嵌视图)来实现,总的来说sqlserver更简单些. 测试例子如下: create table ...

随机推荐

  1. Java [Leetcode 383]Ransom Note

    题目描述: Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 al ...

  2. 设计模式之桥接(bridge)模式

    在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔.假设我们需要大.中.小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支.但如果使用毛笔的话,只需要提供3 ...

  3. ZOJ-Big string(服气思维)

    个人心得:我在分治上看到的,但是感觉跟分治没关系,一眼想到斐波那契数可以找到此时n的字符串,但是无法精确到字母,题解的思路 真是令人佩服,以BA为基准,然后只要此时的长度大于7那么必然可以减去最大的斐 ...

  4. fn project Message Queues 配置

      Message Queues A message queue is used to coordinate asynchronous function calls that run through ...

  5. 网络服务器带宽Mbps、Mb/s、MB/s的区别

    例如所谓 10M 带宽,其实是指 10Mbps (兆比特) 计算带宽理论最快下载速度:10÷8=1.25MB/s 那么100M的带宽最快下载速度是12.5MB/s. 但这只是理论上的速度,在这个数值附 ...

  6. Spring Boot Oauth2

    Oauth2是描述无状态授权的协议(授权框架),因为是无状态,所以我们不需要维护客户端和服务器之间的会话. Oauth2的工作原理: 此协议允许第三方客户端代表资源所有者访问受保护资源,Oauth2有 ...

  7. selenium 看有啥api 的文件(文件用编辑器 or 浏览器打开就可以看到有什么 api)

  8. 【转】使用JMeter 完成常用的压力测试(二)

    使用JMeter 完成常用的压力测试 Login.jsp 和welcome.jsp.其中 login.jsp 负责生成 User 对象,并调用 User 的login.当 login 返回为 true ...

  9. Py修行路 python基础 (八)函数(随时更改)

    为何要用函数: 1.解决代码重用的问题 2.提高代码的可维护性,统一维护 3.程序的组织结构清晰,可读性强 定义函数 先定义后使用!!! def funcname(arg1,arg2,.....)  ...

  10. 委托BegionInvoke和窗体BegionInvoke

    委托BegionInvoke是指通过委托方法执行多线程任务,例如: //定义委托成员变量 delegate  void dg_DeleAirport(); //指定委托函数 dg_DeleAirpor ...