当前位置: 首页 > news >正文

临时表和变量表的区别

我们经常使用临时表和表变量,那现在我们就对临时表和表变量进行一下讨论.

 

临时表

局部临时表

全局临时表

表变量

                             

临时表

临时表存储在TempDB数据库中,所有的使用此SQL Server 实例的用户都共享这个TempDB,因为我们应该确保用来存储TempDB数据库的硬盘有足够的空间,以使之能够自己的增长.最好能够存储在一个拥有独立硬盘控制器上.因为这样不存在和其它的硬盘I/O进行争用.

 

我们很多程序员认为临时表非常危险,因为临时表有可能被多个连接所共享.其实在SQL Server中存在两种临时表:局部临时表和全局临时表,局部临时表(Local temp table)以#前缀来标识,并且只能被创建它的连接所使用.全局临时表(Global temp table)以##前缀来进行标识,并且可以和其它连接所共享.

 

局部临时表

局部临时表不能够被其它连接所共享的原因其实是在SQL Server 2000中自动为局部临时表的表名后面加上了一个唯一字符来标识.如:

                           CREATE TABLE [#DimCustomer_test]

                           (

                              [CustomerKey] [int]

                              ,   [FirstName] [nvarchar](50) 

                          ,[MiddleName] [nvarchar](50) 

                          ,[LastName] [nvarchar](50)

                              )

现在我们来查看一下TempDB中 sysobjects表,我们会发现我们新创建的临时表#DimCustomer_test已经被加上了后缀:

 

                              USE TempDB

                              GO

                              SELECT name FROM sysobjects WHERE name LIKE '%DimCustomer%'

 

the Result is:

name

#DimCustomer_test___________________________________________________________________________________________________000000000005

全局临时表

下面我们来看一下全局临时表:

                              CREATE TABLE [##DimCustomer_test]

                              (

                                 [CustomerKey] [int]

                                 ,      [FirstName] [nvarchar](50) 

                             ,[MiddleName] [nvarchar](50) 

                             ,[LastName] [nvarchar](50)

                                 )

现在我们来查看一下TempDB中 sysobjects表,我们会发现我们新创建的临时表##DimCustomer_test没有被加上了后缀:

 

                              USE TempDB

                              GO

                              SELECT name FROM sysobjects WHERE name LIKE '%DimCustomer%'

 

The Result are:

#DimCustomer_test___________________________________________________________________________________________________000000000005

##DimCustomer_test

 

--Drop test temp tables

                              DROP TABLE [##DimCustomer_test]

                              DROP TABLE [#DimCustomer_test]

 

可以看到我们刚才创建的全局临时表名字并没有被加上标识.

 

表变量

表变量和临时表针对我们使用人员来说并没有什么不同,但是在存储方面来说,他们是不同的,表变量存储在内存中.所以在性能上和临时表相比会更好些!

 

另一个不同的地方是在表连接中使用表变量时,要为此表变量指定别名.如:

 

                              USE AdventureWorksDW

                              GO

 

                              DECLARE @DimCustomer_test TABLE

                              (

                                 [CustomerKey] [int]

                                 ,      [FirstName] [nvarchar](50) 

                             ,[MiddleName] [nvarchar](50) 

                             ,[LastName] [nvarchar](50)

                                 )

                              ---insert data to @DimCustomer_test

                              INSERT @DimCustomer_test

                              (

                                 [CustomerKey] 

                                 ,      [FirstName] 

                             ,[MiddleName] 

                             ,[LastName]

                                 )

                              SELECT 

                                 [CustomerKey] 

                                 ,      [FirstName] 

                             ,[MiddleName] 

                             ,[LastName]

                              FROM DimCustomer

 

                              SELECT [@DimCustomer_test].CustomerKey,SUM(FactInternetSales.OrderQuantity)

                              FROM @DimCustomer_test  INNER JOIN FactInternetSales   ON

                              @DimCustomer_test.CustomerKey = FactInternetSales.CustomerKey

                              Group BY CustomerKey

 

Result:

 

Server: Msg 137, Level 15, State 2, Line 32

Must declare the variable '@DimCustomer_test'.

 

 

如果我们对上面的查询进行更改,对查询使用别名(并且找开IO):

-----in the follow script,we used the table alias.

 

                              DECLARE @DimCustomer_test TABLE

                              (

                                 [CustomerKey] [int]

                                 ,      [FirstName] [nvarchar](50) 

                             ,[MiddleName] [nvarchar](50) 

                             ,[LastName] [nvarchar](50)

                                 )

 

                              INSERT @DimCustomer_test

                              (

                                 [CustomerKey] 

                                 ,      [FirstName] 

                             ,[MiddleName] 

                             ,[LastName]

                                 )

                              SELECT 

                                 [CustomerKey] 

                                 ,      [FirstName] 

                             ,[MiddleName] 

                             ,[LastName]

                              FROM DimCustomer

 

                              SELECT t.CustomerKey,f.OrderQuantity

                              FROM @DimCustomer_test t INNER JOIN FactInternetSales  f ON

                              t.CustomerKey = f.CustomerKey

                              where t.CustomerKey=13513

 

表变量在批处理结束时自动被系统删除,所以你不必要像使用临时表表一样显示的对它进行删除.

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lovedick/archive/2007/03/06/1522214.aspx

转载于:https://www.cnblogs.com/gllgsoft/archive/2010/06/23/1763585.html

相关文章:

  • Flink – submitJob
  • 经典SQL语句大全(2)
  • 四方联合启动医保移动支付试点 激活移动医疗产业链
  • 编辑工具使用技巧-Ultraedit、Editplus
  • 8个Javascript小技巧,让你写的代码有腔调
  • 常用 SQL 语句大全
  • 蓝桥杯 取球游戏(博弈)
  • 辅助域控及dns设置详解
  • [转载]等角(斜45度)游戏与数学
  • jQ效果:jQuery之插件开发短信发送倒计时功能
  • IIS伪静态配置
  • int main(int argc,char* argv[])详解
  • system权限运行cmd
  • IE 错误500
  • 老男孩教育每日一题-2017年3月22日:请说明用户访问网站流程
  • #Java异常处理
  • @jsonView过滤属性
  • angular2开源库收集
  • Javascript 原型链
  • maven工程打包jar以及java jar命令的classpath使用
  • mysql_config not found
  • quasar-framework cnodejs社区
  • springMvc学习笔记(2)
  • 第2章 网络文档
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 力扣(LeetCode)22
  • 前端相关框架总和
  • 前言-如何学习区块链
  • 三分钟教你同步 Visual Studio Code 设置
  • 说说动画卡顿的解决方案
  • 微信开源mars源码分析1—上层samples分析
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 移动端解决方案学习记录
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​如何防止网络攻击?
  • (175)FPGA门控时钟技术
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (备忘)Java Map 遍历
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (六)Hibernate的二级缓存
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)Mysql的优化设置
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .bat批处理(一):@echo off
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net CF下精确的计时器
  • .NET CLR基本术语
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net反编译工具