1、表的类型:

  SqlServer数据库中分为两个表:永久表、临时表;通过表名的前缀区分。

  • 永久表:与物理文件、C# 中的静态类 类似,任何用户均可对其执行操作并且相互影响;
  • 临时表:简单的说就是使用时创建,断开连接即自动 drop。

2、临时表的分类

  临时表又分为本地临时表、全局临时表;临时表创建在 tempdb 中。

  • 本地临时表:作用与oracle的会话临时表相似。以 # 开头;打开连接后手动创建,其他用户无法访;,当其他用户创建同名的本地临时表时,SqlServer数据库自动添加后缀以区分。避免相互干扰;当前用户断开连接时自动drop。
  • 全局临时表:表名以 ## 开头;打开连接后手动创建,之后与永久表类似,其他用户也可对其操作。当前用户断开连接后,此后新连接的用户不再被允许操作。当之前访问的用户全部断开连接之后再自动drop。

3、创建临时表:

方法一:
     create table #table_name (字段1 约束条件, 字段2 约束条件)
        方法二:
     select * into #table_name from table1;

4、判断临时表是否存在

if object_id('tempdb..#cxxsybbyd_jb_lbSZQ') is null Begin
CREATE TABLE #cxxsybbyd_jb_lbSZQ(
[f_FL] [varchar](20) NULL,
[f_XH] [varchar](20) NULL,
[f_dwmc] [varchar](100) NULL,
[f_xmmc] [varchar](20) NULL,
[F_QDEM] [float] NULL,
[F_hksrM] [float] NULL,
[F_hkmlM] [float] NULL,
[F_QDEs] [float] NULL,
[F_hksrs] [float] NULL,
[F_hkmls] [float] NULL
);
print 1;
End
else
begin
print 2;
end

判断临时表是否存在

5、临时表的使用

  使用步骤如下:

  • 1)、判断临时表是否存在,不存在则创建;
  • 2)、删除临时表数据;
  • 3)、将中间数据存入临时表中;
  • 4)、从临时表中获取数据;

例:

ALTER procedure [LC00019999].[cx_xsybb_yd_jb_lb]
@cxnd varchar(10),
@cxyf varchar(10),
@cxrq varchar(10),
@cylb varchar(20)
-- [cx_xsybb_yd_jb_lb] '2015','12','7','产业单位'
as
begin --没有则创建
if object_id('tempdb..#cxxsybbyd_jb_lbSZQ') is null Begin
CREATE TABLE #cxxsybbyd_jb_lbSZQ(
[f_FL] [varchar](20) NULL,
[f_XH] [varchar](20) NULL,
[f_dwmc] [varchar](100) NULL,
[f_xmmc] [varchar](20) NULL,
[F_QDEM] [float] NULL,
[F_hksrM] [float] NULL,
[F_hkmlM] [float] NULL,
[F_QDEs] [float] NULL,
[F_hksrs] [float] NULL,
[F_hkmls] [float] NULL
);
End declare @yf varchar(2); select @yf= case when substring(convert(varchar(10),getdate(),112),5,2)<4
then convert(varchar(2),substring(convert(varchar(10),getdate(),112),5,2)+12)
else substring(convert(varchar(10),getdate(),112),5,2) end ; delete from #cxxsybbyd_jb_lbSZQ; --使用之前必须delete。
--月度目标
insert into #cxxsybbyd_jb_lbSZQ(f_FL,f_XH,f_dwmc,f_xmmc, F_QDEM,F_hksrM ,F_hkmlM)
select BZ1,BZ2,cymc,RIGHT(''+convert(varchar(2),yf),2),sum(cast(qde as float))as qde,sum(cast(hksr as float)) as hksr,sum(cast(hkml as float)) as hkml
from view_mb,v_xsrb_dwgl WHERE DWMC=CYMC and NF=@cxnd AND RIGHT(''+convert(varchar(2),yf),2)=RIGHT(''+convert(varchar(2),@CXYF),2) group by cymc,BZ1,BZ2,YF; --月度实际
insert into #cxxsybbyd_jb_lbSZQ(f_FL,f_XH,f_dwmc,f_xmmc, F_QDEs,F_hksrs,F_hkmls)
select BZ1,BZ2,v_xsrb_dwgl.DWMC,RIGHT(''+convert(varchar(2),yf),2),sum(cast(qde as float))as qde,sum(cast(hksr as float)) as hksr,sum(cast(hkML as float)) as hkML
from view_yb ,v_xsrb_dwgl WHERE NF=@cxnd and view_yb.DWMC=v_xsrb_dwgl.DWMC and CAST(yf AS int)=CAST(@cxyf AS int)
group by BZ1,BZ2,v_xsrb_dwgl.DWMC,yf; ---结果展示
select f_fl,sum(F_QDEM)QDEM ,SUM(F_QDEs) QDES, SUM(F_hksrM) HKSRM,SUM(F_hksrs) hksrs,
SUM(F_hkmlM)hkmlM ,SUM(F_hkmls) hkmls from #cxxsybbyd_jb_lbSZQ where f_fl like '%'+@cylb+'%'
group by f_fl;
truncate table #cxxsybbyd_jb_lbSZQ;
END

临时表使用示例

问题:临时表在连接断开后自动 drop ,理论上下次连接打开就不存在该临时表,为何还要判断是否存在呢。

解:

1)、理论上连接断开,临时表自动 drop 掉,可以按如下步骤验证:

  • a、在SqlServer管理器中新建查询(姑且认为是查询A),先后执行创建临时表和查询临时表,代码如下:
--1、创建临时表
CREATE TABLE #cxxsybbyd_jb_lbSZQ(
[f_FL] [varchar](20) NULL,
[f_XH] [varchar](20) NULL,
[f_dwmc] [varchar](100) NULL,
[f_xmmc] [varchar](20) NULL,
[F_QDEM] [float] NULL,
[F_hksrM] [float] NULL,
[F_hkmlM] [float] NULL,
[F_QDEs] [float] NULL,
[F_hksrs] [float] NULL,
[F_hkmls] [float] NULL
);
--2、访问临时表
select * from #cxxsybbyd_jb_lbSZQ;

临时表声明周期验证1

如图,可以正常查询。

  • b、此时关闭当前查询A,再次新建查询B,或者不关闭当前查询A,直接新建查询B,执行查询,结果如下:

可以看到刚才创建的临时表不存在。

  不同的查询 tap 页,对应着不同的数据库连接,彼此之间创建的临时表相互隔绝。就是说查询A中创建的临时表在查询B中是无法访问的。而且查询A tap页关闭时,对应的数据库连接也就关闭了,临时表drop,再次新建连接也就无法查询到临时表了。

  2)、正如1)中所说,数据库连接断开即自动将临时表 drop 掉,数据就更不可能存在。但我们依然必须在创建临时表前判断是否存在并 delete临时表中的数据。原因在于存储过程是在程序中调用执行的。以C#为例,由于与数据库的连接每次打开、关闭要占用一部分时间,为了提高效率,.NET平台提供了连接池的机制。连接池中保存着几条一直处于连接状态(即open)的数据库连接。假设有连接A、B、C 三条连接。我们使用的数据库连接是从 连接池 中获取的连接A,。当我们显式的调用 close() 方法时,实际上仅仅是将连接A放回连接池,并没有关闭连接,该连接创建的临时表也就一直存在。当下一次获取连接时,就有可能获取到之前的连接A,此时你就可以访问到之前创建的临时表,临时表中的数据也存在。为了避免干扰,所以必须要delete。

SqlServer——临时表的更多相关文章

  1. sqlserver 临时表、表变量、CTE的比较

    原文地址:  sqlserver 临时表.表变量.CTE的比较 1.临时表 1.1 临时表包括:以#开头的局部临时表,以##开头的全局临时表. 1.2 存储 不管是局部临时表,还是全局临时表,都会放存 ...

  2. Oracle、SqlServer——临时表

    一.oracle 1.概述: oracle数据库的临时表的特点: 临时表默认保存在TEMP中: 表结构一直存在,直到删除:即创建一次,永久使用: 不支持主外键. 可以索引临时表和在临时表基础上建立视图 ...

  3. SqlServer 临时表

    SqlServer中临时表分为两种:一种是局部(本地)临时表,用#TableName表示.一种是全局(服务器)临时表,用##TableName表示. 创建临时表: 1. create table #T ...

  4. SQLServer 临时表的使用

    临时表在Sqlserver数据库中,是非常重要的,下面就详细介绍SQL数据库中临时表的特点及其使用,仅供参考. 临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除.临时表有两种类 ...

  5. sqlserver临时表操作

    创建临时表        方法一:      create table #临时表名(字段1 约束条件,                       字段2 约束条件,                  ...

  6. SqlServer 临时表 与 表变量(转)

    1. 表变量 变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理解为标准变量,就是标准数据类型的变量,例如整型int或者日期型DateTime).以@前缀的表变量是本地的,因此 ...

  7. SqlServer 临时表、表变量、函数 替代游标

    http://www.cnblogs.com/chongzi/archive/2011/01/19/1939106.html 临时表 存放在tempdb中 --存储过程中将多表连接结果写入到临时表中, ...

  8. sqlserver临时表排序问题

    在2005和2008中,如果将有序的记录插入临时表,则从临时表查看出来的记录是有序的(不使用Order by也是有序状态) 但从2012开始,即使插入的记录集是有序的,查看出来的结果变得无序了,需要依 ...

  9. 判断MS SQLSERVER临时表是否存在

    drop table  #tempcitys select * into #tempcitys from hy_citys 上面的语句第一次运行的时候就肯定出错了,但第二次就不会.因为select * ...

随机推荐

  1. 【第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛-F】等式(因子个数)

    题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数.(x.y.n均为正整数) 输入描述: 在第一行输入一个正整数T.接下来有T行,每行输入一个正整数n,请求出符合该方程要求的 ...

  2. inline,block,inline-block解析

    display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...

  3. git修改远端服务器地址

    方法有三种: 1.修改命令 git remote set-url origin [url] 2.先删后加 git remote rm origingit remote add origin [url] ...

  4. Git介绍及基本操作

    Git基本概念 在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录 ...

  5. R 之 rJava 包安装错误的解决方案

    前几天在Ubuntu上安装R中的xlsx包时一直卡在了rJava包的安装上,最终各种google都没能解决问题.直到最后,我回到了安装rJava时的错误记录....我用血的教训证明,错误日志是很重要很 ...

  6. 【解题报告】[动态规划]RQNOJ - PID72 / 拔河比赛

    原题地址:http://www.rqnoj.cn/problem/72 解题思路:基本的01背包问题. 要求的就是在这些人中选出一些人,使得这些人的体重的和 不超过所有人的体重的一半 并最大. 代码: ...

  7. 【操作系统】总结五(I/O管理)

    输入输出管理本章主要内容: I/O管理概述(I/O控制方式.I/O软件层次结构)和I/O核心子系统(I/O调度概念.局速缓存与缓冲区.设备分配与回收.假脱机技术(SPOOLing)). 5.1 I/O ...

  8. 简述MVC模式

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  9. 在DIV里面让图片居中

    .content.itemDiv{ display: table-cell;width: 171px;height: 133px;text-align: center; vertical-align: ...

  10. js插件大全 jquery插件大全

    CocoaUI - 一个强大的 iOS UI 框架 http://www.cocoaui.com/ tab,slider,轮播不错的说 http://www.superslide2.com/index ...