1. Select … into VS insert into … select
前者会创建一张新表,后者是把select之后的结果集插入到已存在的表中。
The SELECT INTO statement creates a new table and populates it with the result set of the SELECT statement.
The select * into table1 from table2 where 1=1 creates table1 and inserts the values of table2 in them. So, if the table is already created that statement would give an error.The insert into table1 select * from table2 only inserts the values of table2 in table1.
2. 临时表 VS 表变量
局部/全局临时表 用#/##定义
局部/全局表变量 用@/@@定义
临时表一般被创建后,如果在执行的时候,没有通过DROP Table的操作,第二次就不能再被创建,因为它已经存在于tempdb中;而定义表变量不需要进行DROP Table的操作,一次执行完成后就会消失。
1)使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。
2)一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用临时表,同时还可以创建索引,由于临时表是存放在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。
3. nolock使用
这篇博文对nolock的使用场景做了详细阐述。总之,在生产环境中,在海量数据中查看历史记录,要养成使用nolock的好习惯。
http://www.cnblogs.com/GoGoagg/archive/2010/08/15/1799939.html
4. quotename的使用
quote字面意思就是‘引用’。比如,有个表名是特殊关键字,index,good luck一类的,那么若要在query中提到这个表名,就采用[index],[good luck]...所以quotename就应运而生了:
DECLARE @tbname VARCHAR(256)上面是网上随处可见的quotename用法的例子,但exec有语法错误。正确的写法应该是:
SET @tbname = 'index'
EXEC ('select * from ' + QUOTENAME(@tbname))
use appletest
declare @tbname varchar(256), @sql varchar(256)
set @tbname='index'
set @sql = 'select * from '+QUOTENAME(@tbname)
exec(@sql)