临时表内涵:以#开头的局部临时表,以##开头的全局临时表。存储:存放在tempdb数据库(包含 局部临时表,全局临时表)。作用域: 局部临时表:对当前连接有效,只在创建它的存储过度、批处理、动态语句中有效,类似于C语言中局部变量的作用域。 全局临时表:在所有连接对它都结束引用时,会被删除,对创建者来说,断开连接就是结束引用;对非创建者,不再引用就是结束引用。最好在用完后,就通过drop table 语句删除,及时释放资源。特性:能和普通表一样定义约束和创建索引,有数据分布的统计信息,开销和普通的表一样。使用场景:数据量小直接当做中间表使用,数据量较大可以通过优化提高查询效率,对于复杂的查询可以将中间结果放在临时表中以固化执行计划(专治执行计划走错)
if(object_id('tempdb..#t')is not null)
drop table #t
go
select top 1000 * into #t from [dbo].[WeChatInfo]
--drop table #t
select * from #t
却别: select into from要求目标表(destTbl)不存在,因为在插入时会自动创建。
insert into select from要求目标表(destTbl)存在,由于目标表已经存在,所以我们除了插入源表(srcTbl)的字段外,还可以插入常量,如例中的:3。
insert into select from要求目标表(destTbl)存在,由于目标表已经存在,所以我们除了插入源表(srcTbl)的字段外,还可以插入常量,如例中的:3。
表变量存储:表变量存放在tempdb数据库中。作用域:和普通的变量一样,在定义表变量的存储过程、批处理、动态语句、函数结束时,会自动清除。特性:可以有主键,但不能直接创建索引,也没有任何数据的统计信息。使用场景:小数据量(百条以内)注意:表变量不受事务的约束,下面的DEMO会演示。
declare @ordertable(ID int,Namevarchar(20))
declare @Detailtable(ID int,Pricefloat)
insert into@order(ID,Name) values(1,'aa'),(2,'bb'),(3,'cc')
insert into@Detail(ID,Price) values(1,10.5),(2,12.3),(4,5.9)
select *from @order
select * from @Detail