原文链接:https://www.cnblogs.com/zhaowei303/articles/4204805.html

SQL数据库中数据处理时,有时候需要建立临时表,将查询后的结果集放到临时表中,然后在针对这个数据进行操作。

  创建“临时表”(逻辑上的临时表,可能不一定是数据库的)的方法有一下几种:

  1.with tempTableName as方法(05之后出现):

  with temptable as 其实并没有建立临时表,只是子查询部分(subquery factoring),定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。

  示例:

  with Sndas(select * from category where cgtype=2and parentid=@FstCgid),thrdas(select c.* from category cinner join Snd son c.parentid=s.cgidand c.cgtype=3),forthas(select c.* from category cinner join thrd ton c.parentid=t.cgidand c.cgtype=4)

  注意:上述代码,要是在with Snd前面加一句  “decalare @FstCgid int =1234”,必须以“;”结尾,否则会报错;

  备注:如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。

  

  2.临时表方法

  临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在(临时表一般被创建后,如果在执行的时候,没有通过DROP Table的操作,第二次就不能再被创建)。临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件。

  临时表分为本地和全局两种,本地临时表的名称都是以“#”为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除。全局临时表的名称都是以“##”为前缀,创建后对任何用户都是可见的,当所有引用该表的用户断开连接时被删除。

  示例: 

if object_id('tempdb..#tempCategory') is not null drop table #tempCategorycreate table #tempCategory(num int,CGName varchar(50),CGID int,PartnerID int,UpdTime datetime,Operator varchar(50))

  备注:临时表的一些特性:

  1)添加、修改、删除列。例如,列的名称、长度、数据类型、精度、小数位数以及为空性均可进行修改,只是有一些限制而已。

  2)可添加或删除主键和外键约束。

  3)可添加或删除 UNIQUE 和 CHECK 约束及 DEFAULT 定义(对象)。

  4)可使用 IDENTITY 或 ROWGUIDCOL 属性添加或删除标识符列。虽然 ROWGUIDCOL 属性也可添加至现有列或从现有列删除,但是任何时候在表中只能有一列可具有该属性。

  5)表及表中所选定的列已注册为全文索引。

  3.表变量方法

  表变量创建的语法类似于临时表,区别就在于创建的时候,必须要为之命名。表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都是以“@@”为前缀,一般都是系统的全局变量,像我们常用到的,如@@Error代表错误的号,@@RowCount代表影响的行数。

  示例:

DECLARE @News Table ( News_id int NOT NULL, NewsTitle varchar(100), NewsContent varchar(2000), NewsDateTime datetime )

 

  上述三种方法的区别:

  临时表和表变量的区别:

  1)表变量是存储在内存中的,当用户在访问表变量的时候,SQL Server是不产生日志的,而在临时表中是产生日志的;

  2)在表变量中,是不允许有非聚集索引的;

  3)表变量是不允许有DEFAULT默认值,也不允许有约束;

  4)临时表上的统计信息是健全而可靠的,但是表变量上的统计信息是不可靠的;

  5)临时表中是有锁的机制,而表变量中就没有锁的机制。

  临时表和表变量的选择:

  1)使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。

  2)一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用临时表,同时还可以创建索引,由于临时表是存放在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。

  CTE和WITH AS短语结合使用提高SQL查询性能:

  cet要比表变量效率高得多!

  表变量实际上使用了临时表,从而增加了额外的I/O开销,因此,表变量的方式并不太适合数据量大且频繁查询的情况。

注:存储过程中局部临时表是事务级的如下图:

图片1

图片2:

图1的写法 A和B属于两个不同的事务,所以会报错。而图2的写法是一个事务里面则成功执行。

2. 其他写法就是不用拼接SQL语句,直接写就行

select * into #TempProducts from [dbo].[Sys_Product];

select * from #TempProducts;

3. 一个#号的临时表是事务级别的,就是说一个临时表只存在于一个事务里面。

转载于:https://www.cnblogs.com/gered/p/8072657.html

SQL数据库中临时表、临时变量和WITH AS关键词创建“临时表”的区别相关推荐

  1. SQL Server中的表变量

    In this article, we will explore the table variable in SQL Server with various examples and we will ...

  2. 【SQL数据库基础08】变量--系统变量:全局、会话、自定义变量

    文章目录 一.系统变量 1.查看所有系统变量 2.查看满足条件的部分系统变量 3.查看指定的系统变量的值 4.为某个系统变量赋值 1.1 全局变量 ①查看所有全局变量 ②查看满足条件的部分系统变量 ③ ...

  3. oracle判断是否为空为空赋值,sql数据库中ISNULL函数用法 sql语句判断值是否为空...

    在使用sql数据库的过程,由于服务器设置不当导致sql server的某个字段为空,导致部分内容显示失败,就需要将为空的字符替换为制定的字符. 例子,sql语句: use 数据库 update new ...

  4. mysql 生明变量_在 MySQL 的 SQL 文件中,定义变量与使用变量

    1.现阶段存在一个新需求,需要在部署产品时,针对产品做一些初始化数据的工作.预先准备好相应的 SQL 文件.由于需要执行多条 SQL 语句,且后续的 SQL 语句依赖于之前的 SQL 语句生成的主键 ...

  5. Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

    知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中 ...

  6. azure云数据库_在Azure SQL数据库中保护数据的五种方法

    azure云数据库 When storing data in the cloud the main concern companies generally have is whether or not ...

  7. 在SQL数据库中搜索对象的不同方法

    This article explores various ways to search for database objects in SQL database such as tables, st ...

  8. azure云数据库_在Azure SQL数据库中配置电子邮件通知

    azure云数据库 In this article, we will review how to configure email notifications in the Azure SQL sing ...

  9. azure云数据库_在Azure SQL数据库中实现动态数据屏蔽

    azure云数据库 In this article, we will review Dynamic Data Masking in the Azure SQL database. Dynamic Da ...

最新文章

  1. java.lang.IllegalMonitorStateException 异常出现原因
  2. 怎样用Jenkins触发还有一个Jenkins---Global build solution
  3. VMware 虚拟化编程(14) — VDDK 的高级传输模式详解
  4. C++ 接口(抽象类)
  5. 返回地址【数据结构】
  6. Flink 1.7.2 dataset transformation 示例
  7. Maven配置SpringMVC4+Spring4+Mybatis3环境
  8. oracle r11,Oracle XML Publisher在Oracle R11i中的实际运用
  9. 从大厂出来后,我工资翻了一翻
  10. 20170216--PYthon 类 +面向对象编程+(文件的处理+echo小程序的实现)
  11. PowerBuilder从入门到精通(PB12.5)
  12. C语言写计算ln()计算式,NTC热敏电阻温度计算方法,Steinhart-Hart方程和B值法(转)...
  13. @Lazy注解简单理解
  14. 【哈佛公开课】积极心理学笔记-05环境的力量
  15. 如何将两张图片上下合成一张?
  16. 弃猪 [ 白话文/文言文双版本 ]
  17. 分享谷歌浏览器的一个插件-OneTab,非常赞
  18. 外呼系统——外呼中心
  19. Qt控件边框颜色设定
  20. C# Microsoft.Office.Interop.Excel Could not load file Error

热门文章

  1. markdown pad激活
  2. 【转】Linux如何在系统启动时自动加载模块
  3. jquery.cookie.js操作cookie实现“记住密码”
  4. mysqldatadir 转移
  5. 加密安装Kli Linux
  6. 互补输出级采用共集形式是为了使_天津大学胡文平《先进材料》:溶液法制备厘米级高度取向有机晶体阵列,可用于高性能有机场效应晶体管...
  7. 人工智能超强面经:文本检测与GAN篇(含答案)
  8. oracle 9i 手工建库,简单记录Oracle 9i数据库手工建库过程
  9. mel滤波器组频率响应曲线_了解二阶滤波器的奈奎斯特图
  10. k40游戏增强版服务器维护中,Redmi K40 游戏增强版发布,第四台 K40 出现了