回覆列表
  • 1 # 使用者7063786766555

    臨時表產生:A: SELECT INTO和B:CREATE TABLE + INSERT INTO

    1. A 要比B 快很多。但是A會鎖定tempdb的SYSOBJECTS、SYSINDEXES、SYSCOLUMNS表,在多使用者併發的時候,容易產生阻塞其他的程序。

    2. 在併發系統中是用B. 大數量的單個語句中,使用A.

    建立臨時表的方法:

    方法一:

    create table #臨時表名(欄位1 約束條件,

    欄位2 約束條件,

    .....)

    create table ##臨時表名(欄位1 約束條件,

    欄位2 約束條件,

    .....)

    方法二:

    select * into #臨時表名 from 你的表;

    select * into ##臨時表名 from 你的表;

    注:以上的#代表區域性臨時表,##代表全域性臨時表

    查詢臨時表

    select * from #臨時表名;

    select * from ##臨時表名;

    drop table #臨時表名;

    drop table ##臨時表名;

    SQL SERVER臨時表的使用

    drop table #Tmp --刪除臨時表#Tmp create table #Tmp --建立臨時表#Tmp ( ID int IDENTITY (1,1) not null, --建立列ID,並且每次新增一條記錄就會加1 WokNo varchar(50), primary key (ID) --定義ID為臨時表#Tmp的主鍵 ); Select * from #Tmp --查詢臨時表的資料 truncate table #Tmp --清空臨時表的所有資料和約束

    相關例子:

    Declare @Wokno Varchar(500) --用來記錄職工號 Declare @Str NVarchar(4000) --用來存放查詢語句 Declare @Count int --求出總記錄數 Declare @i int Set @i = 0 Select @Count = Count(Distinct(Wokno)) from #Tmp While @i < @Count Begin Set @Str = "Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top " + Str(@i) + "id from #Tmp)" Exec Sp_ExecuteSql @Str,N"@WokNo Varchar(500) OutPut",@WokNo Output Select @WokNo,@i --一行一行把職工號顯示出來 Set @i = @i + 1 End

    臨時表

    可以建立本地和全域性臨時表。本地臨時表僅在當前會話中可見;全域性臨時表在所有會話中都可見。

    本地臨時表的名稱前面有一個編號符 (#table_name),而全域性臨時表的名稱前面有兩個編號符 (##table_name)。

    SQL 語句使用 CREATE TABLE 語句中為 table_name 指定的名稱引用臨時表:

    CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)

    INSERT INTO #MyTempTable VALUES (1)

    如果本地臨時表由儲存過程建立或由多個使用者同時執行的應用程式建立,則 SQL Server 必須能夠區分由不同使用者建立的表。為此,SQL Server 在內部為每個本地臨時表的表名追加一個數字字尾。儲存在 tempdb 資料庫的 sysobjects 表中的臨時表,其全名由 CREATE TABLE 語句中指定的表名和系統生成的數字字尾組成。為了允許追加字尾,為本地臨時表指定的表名 table_name 不能超過 116 個字元。

    除非使用 DROP TABLE 語句顯式除去臨時表,否則臨時表將在退出其作用域時由系統自動除去:

    當儲存過程完成時,將自動除去在儲存過程中建立的本地臨時表。由建立表的儲存過程執行的所有巢狀儲存過程都可以引用此表。但呼叫建立此表的儲存過程的程序無法引用此表。

    所有其它本地臨時表在當前會話結束時自動除去。

    全域性臨時表在建立此表的會話結束且其它任務停止對其引用時自動除去。任務與表之間的關聯只在單個 Transact-SQL 語句的生存週期內保持。換言之,當建立全域性臨時表的會話結束時,最後一條引用此表的 Transact-SQL 語句完成後,將自動除去此表。

    在儲存過程或觸發器中建立的本地臨時表與在呼叫儲存過程或觸發器之前建立的同名臨時表不同。如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢。巢狀儲存過程同樣可以建立與呼叫它的儲存過程所建立的臨時表同名的臨時表。巢狀儲存過程中對錶名的所有引用都被解釋為是針對該巢狀過程所建立的表,例如:

    CREATE PROCEDURE Test2 AS CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (2) SELECT Test2Col = x FROM #t GO CREATE PROCEDURE Test1 AS CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (1) SELECT Test1Col = x FROM #t EXEC Test2 GO CREATE TABLE #t(x INT PRIMARY KEY) INSERT INTO #t VALUES (99) GO EXEC Test1 GO

    下面是結果集:

    (1 row(s) affected)

    Test1Col

    -----------

    1

    (1 row(s) affected)

    Test2Col

    -----------

    2

    當建立本地或全域性臨時表時,CREATE TABLE 語法支援除 FOREIGN KEY 約束以外的其它所有約束定義。如果在臨時表中指定 FOREIGN KEY 約束,該語句將返回警告資訊,指出此約束已被忽略,表仍會建立,但不具有 FOREIGN KEY 約束。在 FOREIGN KEY 約束中不能引用臨時表。

    考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地建立索引時,或多個儲存過程或函式需要使用表值時,臨時表很有用。通常,表變數提供更有效的查詢處理。

  • 中秋節和大豐收的關聯?
  • 歐曼的售後怎麼樣?