表变量和临时表

  • 表变量:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 什么是SQL数据库: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是...
    西贝巴巴阅读 1,844评论 0 10
  • 一. Java基础部分.................................................
    wy_sure阅读 3,833评论 0 11
  • 一个人走一条路,原来并没有那么可怕!只是我以为很难。一件事,你越害怕他却深深的抓住你,直到你愿意放手一搏。推销需要...
    专属9877阅读 204评论 0 0
  • hello, wait me,I'll get to u later
    哦哟呵阅读 379评论 0 0