微信号:programmer_club

介绍:程序员第一自媒体,与你探讨码农人生路上遇到的各类泛技术话题,定期为你推荐码农人生思考、感悟以及启迪!

如何阻止SELECT * 语句 ?

2016-01-04 21:59 程序员之家

作者:woodytu

原文:http://www.cnblogs.com/woodytu/p/4913166.html


我们每个人都知道是个不好的做法,但有时我们还是要这样做:我们执行SELECT * 语句。这个方法有很多弊端:


  • 你从你的表里返回每个列,甚至后期加的列。想下如果你的查询里将来加上了VARCHAR(MAX)会发生什么……

  • 对于指定的查询,你不能定义覆盖非聚集索引来克服执行计划里的查找(lookup)运算符,因为你会在额外的索引里重复你的数据……


现在的问题是你如何阻止SELECT *语句?当然你可以进行代码审核,你可以提供最佳模式指导,但谁最终会留意这些?基本上没有人——很遗憾这就就是令人伤心的事实……


但有一个非常简单方法来阻止SELECT *语句,在表里用技术层面来解决。


这个问题的解决方法非常简单:在你的表定义上增加一个产生除零错误的的计算列。这个方法超简单,但却真正有效。我们来看下面的表定义:



如你所见,我这里增加了一个进行除零的计算列。这表示当是查询这个列时,你会得到一个错误信息——例如在SELECT * 语句里:


1 -- A SELECT * statement doesn't work anymore, ouch...

2 SELECT * FROM Foo

3 GO



但另一方面如果你通过名称指定查询列,你不会返回计算列,你的查询如愿正常执行:


1 -- This SQL statement works

2 SELECT Col1, Col2, Col3 FROM Foo

3 GO



很不错吧,是不是?


小结


在各个交流会上我经常提到:有时我们只是变得太复杂了!这个用计算列的方法非常简单——肯定需要表架构修改。但下次设计新表的时候,要记得用这个方法。

 
程序员之家 更多文章 我们这一代人的困惑 神剪辑,揭秘程序员加班内幕,不能看,看完想笑又想哭! 美国12位创新型程序员:让科技永远改变 说说怎么写clean code 500,000+年薪程序猿出身哪里 猎聘网揭秘前十大学校
猜您喜欢 Java开发者 Apache Commons 工具集使用精简 自由软件基金会(FSF)30年 Android获取图片拍照时间 云舒网络2016年会盛典 在认识 Ecto 之前,我从未如此了解 ActiveRecord