• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > sqlserver 临时表 Vs 表变量 详细介绍

sqlserver 临时表 Vs 表变量 详细介绍

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了临时表,表变量等相关知识,希望本文的分享对您有所帮助

说临时表和表变量,这是一个古老的话题,我们在网上也找到很多的资料阐述两者的特征,优点与缺点

这里我们在SQL Server 2005\SQL Server 2008版本上通过举例子,说明临时表和表变量两者的一些特征,让我们对临时表和表变量有进一步的认识。在本章中,我们将从下面几个方面去进行描述,对其中的一些特征举例子说明:

约束(Constraint) 索引(Index) I/0开销 作用域(scope) 存儲位置 其他

例子描述


约束(Constraint)

在临时表和表变量,都可以创建Constraint。针对表变量,只有定义时能加Constraint。

e.g.在Microsoft SQL Server Management Studio(MSSMS)查询中,创建临时表并建Constraint场景,<脚本S1.>

 tempdb

object_id()
#1

#1
(
ID ,
Nr nvarchar(50) ,
OperationTime datetime (getdate()),
PK_#1_ID (ID)
)

#1 CK_#1_Nr (Nr )


< 脚本S1.>中,可以看出在临时表#1的创建时,创建Constraint如“Constraint PK_#1_ID Primary Key(ID)”,也可以在创建临时表#1后创建Constraint,如“Alter Table #1 Add Constraint CK_#1_Nr Check(Nr Between '10001' And'19999')”,下面我们来看表变量的场景,在定义表变量时不能指定Constraint名,定义表变量后不能对表变量创建Constraint。

e.g. 在定义表变量时不能指定Constraint名<代码S2.>

 tempdb

@1
(
ID ,
Nr nvarchar(50) ,
OperationTime datetime (getdate()),
[PK_@1_ID] (ID)
)

在定义表变量后不能对表变量创建Constraint,<代码S3.>

 tempdb

@1
(
ID ,
Nr nvarchar(50),
OperationTime datetime (getdate())
)

@1 [CK_@1_Nr] (Nr )

在<代码S2.>和<代码S3.>中可以发现,在解析T-SQL语法过程就发生错误,也就是SQL Server不支持定义表变量时对Constraint命名,也不支持定义表变量后,对其建Constraint。

这里慎重提示下,在<代码S1.>给临时表建Constraint的时候,特别是在并发场景中,不要指定具体的Constraint名称,不然会发生对象已存在的错误提示。

e.g. 在MSSMS中我们先执行之前<代码S1.>的创建临时表#1,不关闭当前会话的情况下,另建一个查询,执行与<代码S1.>相同的代码,如图

左边的查询窗口,是执行原先的<代码S1.>,右边的查询窗口,是后执行相同的<代码S1.>。在这里,我们注意红色圈圈部分,发现在创建临时表#1的过程,明确给了一个主键名称“PK_#1_ID”,当右边再创建相同临时表#1的时候就发生了对象重复错误问题。我们也可以通过SQL Server提供的系统视图sys.objects查询约束“PK_#1_ID”的信息,

 tempdb



* sys.objects name=

在系统视图sys.objects,发现“PK_#1_ID”名称后面不加如何的随机数值表述不同会话有不同的对象。根据SQL Server对sys.objects的描述规则,sys.objects中的Name列数据是唯一的。当另一个会话创建相同的对象时就会发生对象重复的错误。

在Constraint中,Foreign Key是不能应用与表变量,对于临时表,创建Foreign Key是没有意义的。也就是说临时表不受Foreign Key约束。下面我们通过例子来说明临时表的情况,

e.g.< 脚本S4.>

 tempdb

object_id()
#1

object_id()
#2

#1
(

ID ,
Nr nvarchar(50) ,
OperationTime datetime (getdate()),
PK_#1_ID (ID)
)
#1 CK_#1_Nr (Nr )
#2
(
ID ,
ForeignID , (ForeignID) #1(ID)
)
Go

可以看出对于临时表不强制Foreign Key约束,我们也可以通过SQL Server系统视图sys.foreign_keys查询

 tempdb

* sys.tables name
* sys.foreign_keys

右边的查询,只看到在sys.tables表哦中存在刚才创建的临时表#1和#2,在sys.foreign_keys看不到有关Foreign Key约束信息。这也验证了左边SQL Server提示的,在临时表中无法强制使用Foreign Key约束。

索引(Index)

从索引方面看临时表和表变量,与从Constraint上分析有些类似,在临时表中,它与真实表一样可以创建索引。在表变量定义过程中,也可以创建一些类似唯一和聚集索引。

e.g.< 脚本S5.>

 tempdb



@1 (

ID ,

Nr nvarchar(50)

)

Insert @1 (id,Nr) (1,)

Insert @1 (id,Nr) (2,)

Insert @1 (id,Nr) (8,)

Insert @1 (id,Nr) (3,)

Insert @1 (id,Nr) (7,)

2 *

sys.indexes a

sys.tables b b.object_id=a.object_id

b.create_date

Nr @1 Nr=


上面截的是两张图,第一张图描述在表变量使聚集Primary Key,创建非聚集的Unique约束,第二张图描述查询语句”Select Nr From @1 Where Nr='10005'” 应用到在表变量创建的唯一索引“UQ_#……”

是于临时表索引的例子,我们拿一个例子说明,与前边说的Constraint例子有点相似,这里我们对临时表创建索引,并给索引一个具体名称,测试是否会重复。

e.g.在MSSMS新增两个查询,编写下面的SQL语句:

< 脚本S6.>

 tempdb
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 解析Mysql临时表及特点
  • 什么时候会用到临时表?MySQL临时表的使用总结
  • 总结Sql Server临时表和游标的使用方法
  • 详解MySQL临时表的功能及实例代码
  • 详细介绍MySQL临时表与派生表
  • SQL临时表递归查询子信息并返回记录的代码
  • 关于sqlserver 2005 使用临时表的问题( Invalid object name #te
  • sqlserver通用的删除服务器上的所有相同后缀的临时表
  • sqlserver 动态创建临时表的语句分享
  • sqlserver 临时表 Vs 表变量 详细介绍

相关文章

  • 2018-12-05SQLserver 实现分组统计查询(按月、小时分组)
  • 2018-12-05如何在eclipse中通过jdbc连接mysql数据库
  • 2018-12-05mysql千万级数据分页查询性能优化_Mysql
  • 2018-12-05关于SQL Server的最新更新
  • 2018-12-05SQL Server 存储过程解析
  • 2018-12-05基于mysqldump搭建gtid主从
  • 2018-12-05mysql和Django配置以及数据库的简单操作
  • 2018-12-05MySQL的复制原理和流程是什么?
  • 2017-05-11MySQL中数据导入恢复的简单教程
  • 2018-12-05动态SQL语句使用心得

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 使用MySQL命令行修改密码
    • mysql 服务意外停止1067错误解决办法小结
    • 什么叫MySQL元数据?元数据的介绍及实例代码
    • PHP程序mysql报错mysql has gone away
    • mysql实现条件限制语句的实例(一)
    • ORACLE 常用函数总结(80个)第1/2页
    • MySQL 编码机制
    • 详细介绍解决mysql启动后随即关闭的问题(ibdata1文件损坏导致)
    • Oracle数据安全面面观
    • mysql主从库不同步问题解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有