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函数。
例如:
- 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来操作
SQL Server临时表的使用方案的更多相关文章
- SQL SERVER 临时表导致存储过程重编译(recompile)的一些探讨
SQLSERVER为了确保返回正确的值,或者处于性能上的顾虑,有意不重用缓存在内存里的执行计划,而重新编译执行计划的这种行为,被称为重编译(recompile).那么引发存储过程重编译的条件有哪一些呢 ...
- 使用SQL Server临时表来实现字符串合并处理
处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 union ALL SELECT 'a',2 union ...
- SQL Server 临时表和表变量系列之选择篇
原文地址:https://yq.aliyun.com/articles/69187 摘要: # 摘要 通过前面的三篇系列文章,我们对临时表和表变量的概念.对比和认知误区已经有了非常全面的认识.其实,我 ...
- SQL Server临时表
[]SQL Server临时表]()https://docs.microsoft.com/zh-cn/sql/relational-databases/tables/temporal-tables)
- Oracle临时表和SQL Server临时表的不同点对比
文章来源:http://www.codesky.net/article/201109/141401.html 1.简介 Oracle数据库除了可以保存永久表外,还可以建立临时表temporary ta ...
- SQL SERVER临时表的使用
SQL SERVER临时表的使用 drop table #Tmp --删除临时表#Tmpcreate table #Tmp --创建临时表#Tmp( ID int IDENTITY (1 ...
- 如何实现SQL Server临时表的创建?
以下的文章主要是对SQL Server临时表的创建的实际操作步骤,以及在实际操作中我们要用到的实际应用代码的介绍,我在一个信誉度很好的网站找到一个关于其相关内容今天拿出来供大家分享. 创建临时表 方法 ...
- 大数据时代下的SQL Server第三方负载均衡方案----Moebius测试
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...
- SQL SERVER 临时表的排序问题
在SQL SERVER 2005/2008中,如果将有序的记录插入临时表,则从临时表查询出来的记录是有序的(不依赖ORDER BY也是有序状态),但是从SQL SERVER 2012开始,即使插入的记 ...
随机推荐
- P4949 最短距离(基环树+树链剖分)
题目 P4949 最短距离 做法 先把非树边提出来 查询\((x,y)\)的最短距离就分类查询:树上\((x,y)\)距离,经过非树边距离 带边权查询链长,一个烂大街的套路:树链剖分,节点维护树边距离 ...
- [国家集训队] calc(动规+拉格朗日插值法)
题目 P4463 [国家集训队] calc 集训队的题目真是做不动呀\(\%>\_<\%\) 朴素方程 设\(f_{i,j}\)为前\(i\)个数值域\([1,j]\),且序列递增的总贡献 ...
- 《Python学习手册》(二)
<Python学习手册>(二) --类型和运算 数字 十六进制 八进制 二进制 0x 0o 0b hex() oct() bin() >>>int('10',2) 2 & ...
- Scala:scala的一些简单操作命令
Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. 不太久之前编程语言还可以毫无疑意地归类成“命令式”或者“函数式”或 ...
- React 学习参考资料链接
node.js官网https://nodejs.org/en/download/ React 入门实例教程http://www.ruanyifeng.com/blog/2015/03/react.ht ...
- HTTP与抓包
HTTP就是超文本传输协议,底层使用socket TCP长连接,基于请求与响应,是同步请求. socket 绝对多数语言都是支持socket的,底层走的是二进制传输. HTTP协议实际上是对Socke ...
- Valid sudoku, 是否是有效的数独
问题描述:给定9x9矩阵,看是是否是有效数独,不用全部都填上数字,可以为. 算法分析:这道题就是判断,不难,有效数独三个充分条件,行,列,3*3子矩阵,都要满足数字不能重复. public boole ...
- 手把手教你用Vue2+webpack+node开发一个H5 app
手把手教你用Vue2+webpack+node开发一个H5 app 前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...
- python标准日志模块logging使用
python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用: ...
- eclipse启动Tomcat服务输入http://localhost:8080/报404解决方法
其实如果Tomcat能够正常启动,而就算输入http://localhost:8080时出现404错误,也不会影响Tomcat作为服务器运行.通过eclipse来启动tomcat会碰到“访问http: ...