欺骗其他物体的眼睛,有些目的是自卫,而有些则是为了猎食,例如大家熟悉的变色龙,会随着环境的变化而改变其体色的变化,保护自己;有一种食肉植物,会象花瓣一样,张开
其艳丽的身体,吸引蜜蜂蝴蝶的到来,从而将它门吃掉。
言规正转,SQLServer同样可以欺骗你的眼睛,当你用眼睛看着运行结果,张着嘴巴说
“不可能”的时候,其实SQLServer在暗自偷笑,因为它的目的达到了。我们来看这样的
环境,同一个数据库实例,同一个数据库,同一张表,却不同的结果集,下面是2幅截图:
图一:
图二:
从图一中我们得知这样的信息:查询了Test数据库中的T1表ID为100的数据是有结果的。
从图二中我们却得知,当我更新ID为100的纪录时,却提示”0 row(s) affected”,也就是
提示没有符合条件的纪录可以更新,说到这里,网友们肯定会有几个疑问。
第一,从图来看,应该是SQLServer 2008的界面,会不会是2008的新特性?关于这个,答案是否定的,在2000的版本下也可以这样。
第二,表上一定有触发器给回滚了,所以结果是这样。对于这点,我想说明的是,此表是一个堆表,上面任何约束和触发器都不存在。
第三,从图来看,两个执行是在同一个窗口,重新打开一个窗口再次执行UPDATE语句,结果也会这样?关于这点,我想说的是,可能是也可能不是。
回到前面谈论的伪装,虽然很多动植物都有伪装的本领,但其伪装的科学原理已经被人
门给一一解开了,下面来揭开这一奇妙现象的伪装原理。其实很多网友心中已经有半个答案
了,一定是在执行语句前做了什么设置导致的结果差异。是的,是做了设置,关键是想告诉
大家这个奇特的现象是通过什么设置来实现的。我们先了解FMTONLY这样一个设置,可能
很多网友对此比较陌生,关于这个设置的作用:主要是只将元数据返回给客户端。可以用于测试响应的格式,而不必实际执行查询,默认情况下,此属性是OFF的,下图是将FMTONLY
设置为ON后,查询T1表返回的结果:
从结果已经看出,数据是没有返回的,到这里,答案已经出来了,是不是设置这个属性
以后,就会出现文章前面提到的欺骗现象,是的,只是我设置完属性以后,把语句给去掉,
欺骗了你,另外,我实际上是在不同的查询窗口做的这样一件事,所以会一边查询有数据,一边却更新没有数据。这里你会否有个疑问?它的作用是返回元数据给客户端,那实际上
是不是已经更新了?关于这个,留给网友回去自己去测试了。
最后,希望网友们喜欢我用这样的方式给大家说明SQLServer里的一些奇妙的现象,也欢迎和大家一起讨论,更欢迎指出文章的不足之处,哪怕是标点符号:)。