成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server臨時表的使用方案大全

數據庫 SQL Server
我們今天主要描述的是SQL Server臨時表的實用大全,我在一個網站找到一個關于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來操作

 

 

 

 

責任編輯:佚名 來源: 博客園
相關推薦

2010-10-19 14:45:01

SQL SERVER臨

2010-09-16 15:03:10

SQL Server臨

2010-09-16 17:56:31

SQL server臨

2010-07-22 16:02:29

2021-01-18 05:23:14

SQL 排序Server

2010-07-08 14:42:34

SQL Server臨

2010-10-19 15:25:05

Sql Server臨

2010-05-17 16:31:48

Mysql臨時表

2010-09-16 15:10:48

SQL Server表

2011-03-29 13:22:07

SQL Server臨時表表變量

2010-07-01 14:46:10

SQL Server臨

2010-09-02 16:28:03

SQL刪除

2011-09-02 14:45:43

Oracle臨時表SQL Server臨

2010-10-19 14:56:05

sql server臨

2010-11-11 10:41:03

sql server遍

2010-11-12 13:27:13

動態sql

2010-07-01 14:11:40

SQL Server內

2009-03-18 10:56:29

生命周期全局臨時表SQL Server

2010-10-19 15:31:40

sql server觸

2010-07-08 14:24:21

SQL Server
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人久久精品一区二区三区 | 欧美视频日韩 | 国产激情免费视频 | 日本网站在线看 | 人人看人人射 | 97久久精品午夜一区二区 | 久久久精品网站 | 麻豆成人在线视频 | 成人免费精品视频 | 91av亚洲 | 视频二区 | 国产精品久久久久无码av | 野狼在线社区2017入口 | 成人国产精品免费观看 | 欧美精品中文字幕久久二区 | 成人性视频免费网站 | 国产精品久久久久久一区二区三区 | 97色在线视频 | 亚洲品质自拍视频 | 欧美视频区| 国产精品美女一区二区 | 免费黄色av | 人人做人人澡人人爽欧美 | 久久成人av| 亚洲资源站 | 国产亚洲精品综合一区 | 精品国产乱码一区二区三区a | 欧美天堂在线 | 欧美91| 欧美日韩国产一区二区 | 国产精品一区二区免费看 | 日韩精品一区二区不卡 | 天天干天天爱天天 | 一区二区免费高清视频 | 国产成人高清在线观看 | jizz视频| 自拍偷拍亚洲一区 | 最新国产精品视频 | 亚洲精品福利在线 | 久久艹免费视频 | 最新日韩精品 |