首页 > 数据库 >SqlServer——临时表

SqlServer——临时表

时间:2023-05-25 20:59:08浏览次数:53  
标签:varchar 临时 float SqlServer 20 NULL 连接

@@sqlserver 临时表

 

SqlServer——临时表

 

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('00'+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('00'+convert(varchar(2),yf),2)=RIGHT('00'+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('00'+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;
复制代码

 

如图,可以正常查询。

  • 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。

 

 

转 https://www.cnblogs.com/SunBlog/p/5032936.html

 

标签:varchar,临时,float,SqlServer,20,NULL,连接
From: https://www.cnblogs.com/wl-blog/p/17432886.html

相关文章

  • 创建及使用一个SqlServer的用户自定义表类型(User-Defined Table Type)
    创建一个用户自定义表类型(User-DefinedTableType)CREATETYPE[dbo].[MyTypeName]ASTABLE( [Field1][nvarchar](50)NOTNULL, [Field2][nvarchar](100)NULL, [Field3][nvarchar](50)NULL, [Field4][nvarchar](20)NULL, [Field5][nvarchar](20)NULL)GO直接......
  • sqlserver 创建表时,为何会出现不支持该后端版本设计数据库关系图或表的提示?
    https://www.null123.com/question/detail-2236078.html同事遇到的问题,查了下记录下:由于使用了错误的SSMS版本(SqlServerManagementStudio),这通常被报告为错误。使用为您的数据库版本设计的版本。您可以使用命令select@@version检查您实际使用的sqlserver版本。此版本的报......
  • sqlserver 查询慢语句
    SELECTTOP10total_worker_time/1000AS[自编译以来执行所用的CPU时间总量(ms-毫秒)],total_elapsed_time/1000as[完成执行此计划所用的总时间],total_elapsed_time/execution_count/1000as[平均完成执行此计划所用时间],execution_countas[上次编译以来所执行......
  • MSSQLServer和SQL Server Express、LocalDB的区别
    转载:https://www.cnblogs.com/lucky-donkey/p/13544916.html MSSQLServer:全称MicrosoftSQL Server,微软的数据库服务。SQLServerExpress:MicrosoftSQL Server的一个免费版,功能上有一些限制。                  1.数据库的大小限制:SQ......
  • ruoyi(若依)系统使用SqlServer数据库
    https://blog.csdn.net/op4439/article/details/121469911近期使用若依前后端分离版开发一个公司内部系统,由于指定使用SqlServer数据库,所以采用若依3.7.0版,自己转换脚本及对应查询。具体修改如下:1、admin把mysql引用替换为<dependency><groupId>com.microsoft.sqlserver</g......
  • 关于Sqlserver动态语句传递表变量的用法
    一、定义[用户定义表类型]   --定义表类型   createtypeIntegerTableTypeastable(Idint)   go二、定义[表类型变量]   --表类型变量   declare@declareTableIntegerTableType   insertinto@declareTableselect1三、动态Sql语句   declare......
  • SqlServer查询锁表及解锁
    --查询锁表进程selectrequest_session_idspid,OBJECT_NAME(resource_associated_entity_id)tableNamefromsys.dm_tran_lockswhereresource_type='OBJECT'--解锁进程declare@spidintSet@spid=162--锁表进程declare@sqlvarchar(1000)set@sql='kill......
  • springboot中使用application.properties配置mysql和sqlserver
    1.使用依赖*mysql:<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>*sqlserver:<dependency><groupId>com.microsoft.sqlserver</groupId><art......
  • SqlServer查询存储过程和视图是否用到表字段
     查询存储过程视图是否用到表和字段selectnamefromsysobjectsassinnerjoinsyscommentsasoons.id=o.idwheretextlikeN'%表名%字段名%'--查询表字段SELECTOBJECT_NAME(object_id)'表名',nameAS'列名称'FROMsys.columns......
  • java 连接 sqlserver 报错
    使用最新的sqlserver驱动报错:com.zaxxer.hikari.pool.HikariPool$PoolInitializationException:Failedtoinitializepool:"encrypt"propertyissetto"true"and"trustServerCertificate"propertyissetto"false"butthedri......