SQL——神奇代码1之Update

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

时间: 2024-10-12 22:03:10

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

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

判断一个输入框中是否有SQL攻击代码 public const string SQLSTR2 = @"exec|cast|convert|set|insert|select|delete|update|alter|drop|count|chr|varchar|nvarchar|nchar|char[ ]*\([ ]*|asc[ ]*\([ ]*|mid[ ]*\([ ]*|substring|master|truncate|declare|xp_cmdshell|restore|backup|n

sql注入代码解释

某个网站的登录验证的SQL查询代码为: 1 strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"  恶意填入 2 userName = "1' OR '1'='1"; 与 3 passWord = "1' OR '1'='1"; 时,将导致原本的SQL字符串被填为 4 str

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

1.错误描述 org.hibernate.exception.GenericJDBCException: error executing work at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(Sql

java 连接mysql 和sql server2008代码

这两天用java分别连接mysql和sql server2008代码.刚開始都是有错.如今找到了在 自己机器上成功连接的代码: 1. mysql Class.forName("com.mysql.jdbc.Driver").newInstance(); String url="jdbc:mysql://localhost:3306/website?characterEncoding=utf8";//website为数据库名.读取mysql中中文字符 String u

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

Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. 在下面这段代码里,首先根据连接字符串创建一个SqlConnecdon连接对象,并用此对象连接数据源:然后创建一个SqlCommand对象,并用此对象的ExecuteNonQuery方法执行不带返回结果集的SQL语句. 1 //连接字符串 2 3 private static string strCo

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

原文:update值与原值相同时,SQL Server会真的去update还是忽略呢? 考虑下面的情况: 当update值与原值相同时,SQL Server会真的去update还是忽略?例如: update tbname set name='abc' --name原来的值就是abc where id=1 再如: update tbname set name='abc' --name原来的值就是abc where name='abc' 接下来我们将实际测试: --Microsoft SQL Ser

SQL Server代码的一种学习方法

使用SQL Server Management Studio的操作过程中,界面上方都可以生成sql脚本代码. 如新建数据库时: CREATE DATABASE [db_New] ON PRIMARY ( NAME = N'db_New', FILENAME = N'C:\Program Files (x86)\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\db_New.mdf' , SIZE = 3072KB , FILEGROWT

Mybatis 使用Mapper接口的Sql动态代码方式进行CURD和分页查询

1.Maven的pom.xml 2.配置文件 2.1.db.properties 2.2.mybatis.xml 2.3.log4j.xml 3.MybatisUtil工具类 4.Mapper映射文件 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http

防SQL注入代码(ASP版)

<% Dim Fy_Url,Fy_a,Fy_x,Fy_Cs(),Fy_Cl,Fy_Ts,Fy_Zx '---定义部份 头------ Fy_Cl = 1 '处理方式:1=提示信息,2=转向页面,3=先提示再转向 Fy_Zx = "index.Asp" '出错时转向的页面 '---定义部份 尾------ On Error Resume Next Fy_Url=Request.ServerVariables("QUERY_STRING") Fy_a=split(