如何阻止SELECT * 语句
来源:互联网 发布:网络写手收入 编辑:程序博客网 时间:2024/05/21 14:50
转自:http://www.cnblogs.com/woodytu/p/4913166.html
我们每个人都知道是个不好的做法,但有时我们还是要这样做:我们执行SELECT * 语句。这个方法有很多弊端:
- 你从你的表里返回每个列,甚至后期加的列。想下如果你的查询里将来加上了VARCHAR(MAX)会发生什么……
- 对于指定的查询,你不能定义覆盖非聚集索引来克服执行计划里的查找(lookup)运算符,因为你会在额外的索引里重复你的数据……
现在的问题是你如何阻止SELECT *语句?当然你可以进行代码审核,你可以提供最佳模式指导,但谁最终会留意这些?基本上没有人——很遗憾这就就是令人伤心的事实……
但有一个非常简单方法来阻止SELECT *语句,在表里用技术层面来解决。
这个问题的解决方法非常简单:在你的表定义上增加一个产生除零错误的的计算列。这个方法超简单,但却真正有效。我们来看下面的表定义:
1 -- Create a simple table with a computed column that generates 2 -- a divide by zero exception. 3 CREATE TABLE Foo 4 ( 5 Col1 INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, 6 Col2 CHAR(100) NOT NULL, 7 Col3 CHAR(100) NOT NULL, 8 DevelopersPain AS (1 / 0) 9 )10 GO11 12 -- Insert some test data13 INSERT INTO Foo VALUES ('a', 'a'), ('b', 'b'), ('c', 'c')14 GO
如你所见,我这里增加了一个进行除零的计算列。这表示当是查询这个列时,你会得到一个错误信息——例如在SELECT * 语句里:
1 -- A SELECT * statement doesn't work anymore, ouch...2 SELECT * FROM Foo3 GO
但另一方面如果你通过名称指定查询列,你不会反悔计算列,你的查询如愿正常执行:
1 -- This SQL statement works2 SELECT Col1, Col2, Col3 FROM Foo3 GO
阅读全文
0 0
- 如何阻止SELECT * 语句
- 如何在触发器中调用select语句?
- select语句
- SELECT语句
- SELECT 语句
- SELECT语句
- select 语句
- Select语句
- select 语句
- SELECT语句
- select语句
- select 语句
- select 语句
- select语句
- Select 语句
- select语句
- select语句
- SELECT语句
- 面向对象之定义类、成员变量和方法
- 判断两条线段是否相交(三种算法)
- MySQL中interactive_timeout和wait_timeout的区别
- Java图片缩略图裁剪水印缩放旋转压缩转格式-Thumbnailator图像处理
- java基础
- 如何阻止SELECT * 语句
- Netty-socketio中判断SocketIOClient是否仍然连接
- VMware虚拟磁盘编程指导(五)
- BZOJ 1026 (数位dp)
- 计算机的投资:量化投资
- 求1到100所有的质数
- 剑指offer--用两个栈实现队列
- python基础语言之assert
- 基于深度学习的大规模多标签文本分类任务总结