SQL Server临时表的使用方案大全

我们今天是要和大家一起讨论的是SQL Server临时表的实用大全,如果你对SQL Server临时表的实用大全不是很了解的话,下面的文章就是对其相关内容的具体介绍,希望会给你带来一些帮助在此方面。

引子:

临时数据表格,我们在存储的时候经常遇见。

客户端可以实用Delphi的ClientDataSet的内存表,但是ClientDataSet类似TABLE,不是支持SQL语言的。

当然也可以实用临时表。有时我们避免SQL Server临时表的生命周期的麻烦,更多的使用实际表临时用用。起个什么tempXXX类似的告诉我们他们是临时表。创建释放也没有问题。

那么临时表的周期是什么样子的呢?有什么特殊的用法没有?

1.全局临时表和临时表的区别:视野不同。

 

全局临时表当然就是使用##打头的表格,普通的临时表格为#打头。它们的周期应该随一个连接也就是Connection的诞生而生,随着Connection的断开而死亡。它们的区别不同的地方也就是视野不同。

 

 

全局表,全部授权的Connection都可以看见。但是普通SQL Server临时表(局域临时表)仅仅创建的Connection可以看见。特别说明的是SQL Server的isql.exe每个连接就是一个Connection。

 

 

例如:一个应用程序app.exe有仅adoconnection连接SQL Server数据,那么这个连接中的adoquery或者存储过程建立的全局表##temp1,另外的一个app.exe或者其它的appx.exe都可以使用该表格。

 

 

不同的是普通临时表,由app.exe中的连接connection比如adoconnection的Adoquery建立的临时表#temp,在所有该连接的该程序的app.exe都可以看见并且访问,但是appx.exe或者其它的就不能看见。

 

陷阱:如果一个应用程序app.exe有存储过程和TADOQUERY连接同一个ADOCONNECTION.切记使用存储过程建立的临时表(非全局),就不能被这个连接下的TADOQUERY访问。原因是:存储过程本身是服务器端执行,应该是服务器的CONNECTION。

2.全局表或者SQL Server临时表的存储和建立。

 

估计大家都知道,临时表或者全局表都是在SQL Server的tempdb数据库存储,表我们访问的时候使用#,但是实际在进程里面是以在tempdb里面的用户表以#xxx_________00000000xxx方式存储(是否是进程标识,不大知道,也不想知道)。可以通过isql.exe的tempdb里面看见它们。

 

3。头痛初始化表格

初始化表格,为什么头痛,毕竟使用Drop什么的。或者判断存在比较麻烦。其实也很简单。另外建立临时表,都是无聊的SQL 语句,怎么处理。

方法一:当然是使用存储过程了。可以直接写SQL语句或者写exec (@v_sql)。

方法二:把SQL Server临时表保存到数据里面MEMO里面,读取,直接执行。

判断方法一:可以采用常用的exists函数。

 

例如:

  1. if exists (select * from tempdb..sysobjects where id = object_id(@sTmpWareA) and type = "U"

 

判断方法二:

 

  1. if object_id('tempdb.dbo.##'+@v_userid) is null 

应用方法一:(感谢阿满,迷糊)

一个统计的SQL Server临时表格,使用TADOPROC执行存储过程,如下:

 

  1. CREATE PROCEDURE InitCreateCoawardTable AS  
  2. BEGIN  
  3. IF not (object_id('tempdb.dbo.#Tmp_Detail') is null)  
  4. drop table tempdb.dbo.#Tmp_Detail  
  5. CREATE TABLE tempdb.dbo.#Tmp_Detail (  
  6. [id] [int] IDENTITY (1, 1) NOT NULL , 

 

 

[单据类别] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,

 

[单据编号] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,

 

(。。这里多复杂都可以。。。。。省略。。。)

 

 

  1. select * from tempdb.dbo.#Tmp_Detail  
  2. END  
  3. GO 

 

 

在客户端使用TADOPROC执行这个存储过程,

 

  1. with sproc do  
  2. begin  
  3. try  
  4. Close;  
  5. ProcedureName:=spName;  
  6. Parameters.Refresh;  
  7. Prepared;  
  8. ExecProc; 

 

 

Open;//这句不能省略要不,就出现忽略了数据库名称 ‘,将引用 tempdb 中的对象错误。

 

 

  1. except  
  2. Close;  
  3. Exit;  
  4. end;  
  5. Result:=True;  
  6. end; 

 

 

这样,你的TADOPROC就可以任意使用APPEND,INSERT语句了,更好的是不需要清理,而且方法灵活。更好的有点非常有效的处理并发。当然有些人还在使用建立实际表格代替它,使用会话处理该问题,你还得回收。相当麻烦。而且灵活度差多了。

以下是应用范例转载:

 

利用SQL Server的全局临时表防止用户重复登录

 

在我们开发商务软件的时候,常常会遇到这样的一个问题:怎样防止用户重复登录我们的系统?特别是对于银行或是财务部门,更是要限制用户以其工号身份多次登入。

可能会有人说在用户信息表中加一字段判断用户工号登录的状态,登录后写1,退出时写0,且登录时判断其标志位是否为1,如是则不让该用户工号登录。但是这样那势必会带来新的问题:如发生象断电之类不可预知的现象,系统是非正常退出,无法将标志位置为0,那么下次以该用户工号登录则不可登入,这该怎么办呢?

或许我们可以换一下思路:有什么东西是在connection断开后可以被系统自动回收的呢?对了,SQL Server的临时表具备这个特性!但是我们这里的这种情况不能用局部临时表,因为局部临时表对于每一个connection来说都是一个独立的对象,因此只能用全局SQL Server临时表来达到我们的目的。

好了,情况已经明朗话了,我们可以写一个象下面这样简单的存储过程:

 

  1. create procedure gp_findtemptable -- 2001/10/26 21:36 zhuzhichao in nanjing 

 

/* 寻找以操作员工号命名的全局临时表

* 如无则将out参数置为0并创建该表,如有则将out参数置为1

* 在connection断开连接后,全局临时表会被SQL Server自动回收

* 如发生断电之类的意外,全局临时表虽然还存在于tempdb中,但是已经失去活性

* 用object_id函数去判断时会认为其不存在. */

@v_userid varchar(6), — 操作员工号

@i_out int out — 输出参数 0:没有登录 1:已经登录

 

  1. as  
  2. declare @v_sql varchar(100)  
  3. if object_id('tempdb.dbo.##'+@v_userid) is null  
  4. begin  
  5. set @v_sql = 'create table ##'+@v_userid+'(userid varchar(6))'  
  6. exec (@v_sql)  
  7. set @i_out = 0 
  8. end  
  9. else  
  10. set @i_out = 1 

 

在这个过程中,我们看到如果以用户工号命名的全局SQL Server临时表不存在时过程会去创建一张并把out参数置为0,如果已经存在则将out参数置为1。

这样,我们在我们的应用程序中调用该过程时,如果取得的out参数为1时,我们可以毫不客气地跳出一个message告诉用户说”对不起,此工号正被使用!”

判断方法范例:

 

  1. select @sTmpWareA="tempdb..[##MARWareA"+ @ComputerName+"]"  
  2. if exists (select * from tempdb..sysobjects where id = object_id(@sTmpWareA) and type = "U")   
  3. begin   
  4. set @sTmpWareA="[##MARWareA"+ @ComputerName+"]"   
  5. exec( "drop table " +@sTmpWareA )   
  6. end   
  7. else   
  8. set @sTmpWareA="[##MARWareA"+ @ComputerName+"]"  

 

 

 

@sTmpWareA 就是SQL Server临时表的名称,过程中使用exec来操作

 

 

 

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/305675.html<

(0)
管理的头像管理
上一篇2025-05-26 07:31
下一篇 2025-05-26 07:33

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注