关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »SQL Server临时表的使用方案大全

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

    2010-07-22 15:56:00 出处:ITJS
    分享

    我们今天是要和大家一起讨论的是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函数。

    例如:

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

    判断方法二:

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

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

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

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

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

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

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

    select * from tempdb.dbo.#Tmp_Detail  END  GO 

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

    with sproc do  begin  try  Close;  ProcedureName:=spName;  Parameters.Refresh;  Prepared;  ExecProc; 

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

    except  Close;  Exit;  end;  Result:=True;  end; 

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

    以下是应用范例转载:

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

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

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

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

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

    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:已经登录

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

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

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

    判断方法范例:

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

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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。