-
表变量:
DECLARE @tb table(id int identity(1,1), name varchar(100))
INSERT @tb
SELECT id, name FROM mytable WHERE name like ‘zhang%’
-
临时表:
SELECT name, address
INTO #ta FROM mytable
WHERE name like ‘zhang%’
(if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#ta') and type='U')drop table #ta) -
比较:
1.表变量存在内存,临时表在硬盘,表不是特别大的时候放在内存速度快。
2.建议:触发器、自定义函数用表变量;存储过程看情况,大部分用表变量;特殊的应用,大数据量的场合用临时表。
3.表变量不必删除,也就不会有命名冲突,临时表特别是全局临时表用的时候必须解决命名冲突.
4.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。
5.表变量的缺点:
---表变量上不能创建非聚集索引(为 PRIMARY 或 UNIQUE 约束创建的系统索引除外)
---在初始 DECLARE 语句后不能更改表定义
---表变量不能在 INSERT EXEC 或 SELECT INTO 语句中使用
---表变量不支持truncate,所以完全清空对象结果集时临时表有明显优势,而表变量只能delete
补充:三个事务的大概意思:
begin Transaction 可以理解成新建一个还原点。
commit Transaction 提交这个自begin tran开始的修改
rollback Transaction 表示还原到上个还原点。
--set xact_abort on 整体回滚所有语句
--set xact_abort off 只回滚出错语句
begin tran
update,,,,,
commit tran
set xact_abort on 和 rollback Transaction 结果一样,都是回滚所有。
一般把DML语句(select ,delete,update,insert语句)放在BEGIN TRAN...COMMIT TRAN 之间作为一个事务处理,也就是那些语句执行过程中如果遇到错误,无论哪句遇到错误,所有语句都会回滚到BEGIN TRAN之前的状态。
参考:http://blog.csdn.net/gordennizaicunzai/article/details/50760950