SqlServer之表变量和临时表
表变量:
表变量创建的语法类似于临时表,区别就在于创建的时候,必须要为之命名。表变量是变量的一种,
表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都是以“@@”为前缀,
一般都是系统的全局变量,像我们常用到的,如@@Error代表错误的号,@@RowCount代表影响的行数。
表变量有以下特点:
- 表变量的行为类似于局部变量,有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。
在其作用域内,表变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。但是,表不能用在下列语句中:
INSERT INTO table_variable EXEC 存储过程。
SELECT select_list INTO table_variable 语句。- 在定义表变量的函数、存储过程或批处理结束时,自动清除表变量。
- 表类型声明中的 CHECK 约束、DEFAULT 值和计算列不能调用用户定义函数。
- 在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。
- 涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
- 不支持在表变量之间进行赋值操作。
declare @t1 table(t1 int)
declare @t2 table(t2 int)
set @t1=@t2 –错误- 另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。
示例:
DECLARE @News table
(
News_id int NOT NULL,
NewsTitle varchar(100),
NewsContent varchar(2000),
NewsDateTime datetime
)
INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime)
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News
临时表:
临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在。临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。
临时表分为本地和全局两种,本地临时表的名称都是以“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局临时表的名称都是以“##”为前缀,创建后对任何用户都是可见的,当所有引用该表的用户断开连接时被删除
示例:
CREATE TABLE dbo.#News
(
News_id int NOT NULL,
NewsTitle varchar(100),
NewsContent varchar(2000),
NewsDateTime datetime
)
INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News
DROP TABLE dbo.[#News]
用法:
表变量:无表关联操作,只作为中间集进行数据处理;临时表:有表关联,且不能确定数据量大小的情况下。理论如此,真正用法要按照实际项目需求而定。
| 特性 | 表变量 | 临时表 |
|---|---|---|
| 做哟作用域 | 当前批处理 | 当前回话,嵌套存储过程,全局:所有回话 |
| 使用场景 | 自定义函数,存储过程,批处理 | 自定义函数,存储过程,批处理 |
| 创建方式 | DECLARE statement only,只能通过DECLEARE语句创建 | CREATE TABLE语句,SELECT INTO语句 |
| 表名长度 | 最多128字节 | 最多116字节 |
| 列类型 | 可以使用自定义数据类型,可以使用XML集合 | 自定义数据类型和XML集合必须在TempDb内定义 |
| Collation | 字符串排序规则继承自当前数据库 | 字符串排序规则继承自TempDb数据库 |
| 索引 | 索引必须在表定义时建立 | 索引可以再表创建后建立 |
| 约束 | PRIMARY KEY,UNIQUE,NULL,CHECK约束可以使用,但必须在表建立时声明 | PRIMARY KEY,UNIQUE,NULL,CHECK约束可以使用,可以再任何时间添加,但没有外键约束 |
| 表建立后使用DDL (索引,列) | 不允许 | 允许 |
| 数据插入方式 | INSERT 语句 | NSERT 语句, 包括 INSERT/EXEC.SELECT INTO 语句. |
| Insert explicit values into identity columns (SET IDENTITY_INSERT). | 不支持SET IDENTITY_INSERT语句 | 支持SET IDENTITY_INSERT语句 |
| Truncate table | 不允许 | 允许 |
| 析构方式 | 批处理结束后自动析构 | 显式调用 DROP TABLE 语句. 当前会话结束自动析构 (全局临时表: 还包括当其它会话语句不在引用表.) |
| 事务 | 只会在更新表的时候有事务,持续时间比临时表短 | 正常的事务长度,比表变量长 |
| 存储过程重编译 | 否 | 会导致重编译 |
| 回滚 | 不会被回滚影响 | 会被回滚影响 |
| 统计数据 | 不创建统计数据,所以所有的估计行数都为1,所以生成执行计划会不精准 | 创建统计数据,通过实际的行数生成执行计划 |
| 作为参数传入存储过程 | 并且必须预定义 user-defined table type. | 不允许 |
| 显式命名对象 (索引, 约束). | 不允许 | 允许,但是要注意多用户的问题 |
| 动态SQL | 必须在动态SQL中定义表变量 | 可以在调用动态SQL之前定义临时表 |
SqlServer之表变量和临时表的更多相关文章
- SQL知识整理一:触发器、存储过程、表变量、临时表
触发器 触发器的基础知识 create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,] ...
- SQL Server 表变量和临时表的区别
SQL Server 表变量和临时表的区别 一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯 ...
- SQL 表变量和临时表
SQL 表变量和临时表 表变量:存储在内存中,作用域是脚本的执行过程中,脚本执行完毕之后就会释放内存,适合短时间内存储数据量小的数据集. 优点:使用灵活,使用完之后立即释放,不占用物理存储空间 缺点: ...
- [转]SQL Server 表变量和临时表的区别
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
- SQL表变量和临时表
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束, 唯一约束,NULL约束和CHECK约束(外键 ...
- [MSSQL]表变量和临时表的区别
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
- T-SQL 之 表变量和临时表
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- SQL表变量与临时表区别 + 非游标临时表遍历
SQL表变量与临时表区别 + 非游标临时表遍历 分类: SQL Server2009-11-27 17:01 1196人阅读 评论(2) 收藏 举报 sqlinsert存储sql servermicr ...
随机推荐
- JS框架~Angularjs
无意中看到anytao的项目,工作台,使用了Angularjs框架,感觉在前端表现上用户体验比较好,于是就简单看了一下,原来使用很简单,或者说,人家把代码封装的很好,以至于开发人员调用时比较简单,呵呵 ...
- Atom编辑器快捷键大全
文件切换 ctrl-shift-s 保存所有打开的文件cmd-shift-o 打开目录cmd-\ 显示或隐藏目录树ctrl-0 焦点移到目录树目录树下,使用a,m,delete来增加,修改和删除cmd ...
- eclipse/myeclipse使用技巧
热键篇: Template:Alt + / 修改处:Window->Preference->Workbench->Keys->Command->Edit->Cont ...
- 学用 ASP.Net 之 System.Math 类
本文来自:http://www.cnblogs.com/del/archive/2011/01/03/1924746.html 成员: /* 字段 */ Math.E; //2.7182 ...
- Backup Exec Inventory 与Catalog的含义(转载)
编录:即catalog,就是让磁带机读取磁带之前所备份过的内容的目录列表,可以让你知道之前做过什么备份,以及备份时间等详细信息. 列清单:inventory,跟编录是不同,inventory是查询磁带 ...
- Android SDK开发常用工具的使用及其异常处理
由于以下操作都是命令操作,所以在执行以下操作之前确保环境变量 ANDROID_HOME 指向的是正确的Android SDK的路径: 一.启动Android SDK Manager: android ...
- 20160126--springaop
package com.hanqi; public interface IJiSuanQi { public int jia(int a , int b); public int jian(int a ...
- 如何获取浏览器URL中查询字符串的参数
首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...
- C++ Primer 读书笔记:第11章 泛型算法
第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数 ...
- 第一个MVC模型
根据慕课网的视频自学来的. 关于MVC的简介和一些常识:http://www.cnblogs.com/jobscn/archive/2011/11/08/2240725.html MVC模式 : MV ...