『壹』 如何用PL/sql創建一個臨時表
方法一:例子,過程里建臨時表的,並用游標返回臨時表中數據: create or replace procere ttable(i_cursor out ysq.aboutreport.t_cursor) is strCreateTable varchar2(500); vCount int; begin select count(*) into vCount from user_all_tables where lower(TABLE_NAME) = 'mytemp'; if vCount=0 then --EXECUTE IMMEDIATE ' drop table myTemp'; strCreateTable:='CREATE GLOBAL TEMPORARY TABLE myTemp (id VARCHAR(10),name varchar2(50)) ON COMMIT PRESERVE ROWS '; Execute immediate strCreateTable;--建表 end if; insert into mytemp values('1','sandy'); insert into mytemp values('2','may'); open i_cursor for select * from mytemp; commit; end ttable;方法二:create procere pro as str varchar2(100); begin str:='GLOBAL TEMPORARY TABLE myTemp ON COMMIT PRESERVE ROWS as select * from yourtable where 1=2'; Execute immediate str;--要有此許可權,grant create any table to 當前用戶 end;
『貳』 sql中臨時表創建與使用
臨時表有兩種類型:
本地臨時表
以一個井號 (#) 開頭的那些表名。只有在創建本地臨時表的連接上才能看到這些表,鏈接斷開時臨時表即被刪除(本地臨時表為創建它的該鏈接的會話所獨享)或者這樣說局部臨時表是有當前用戶創建的,並且只有當前用戶的會話才可以訪問。
全局臨時表
以兩個井號 (##) 開頭的那些表名。在所有連接上都能看到全局臨時表或者這樣說只要這個全局臨時表存在,那麼用戶創建會話後對所有的用戶都是可見的。如果在創建全局臨時表的連接斷開前沒有顯式地除去這些表,那麼只要所有其它任務停止引用它們,這些表即被除去。當創建全局臨時表的連接斷開後,新的任務不能再引用它們(換句話說舊的任務還何以引用)。當前的語句一執行完,任務與表之間的關聯即被除去;因此通常情況下,只要創建全局臨時表的連接斷開,全局臨時表即被除去。
有以下方法可以創建
1)顯示地Creat table,如:
create table #tbl_Line(line varchar(10))
insert into #tbl_Line(line)
select distinct ltrim(rtrim(line_no))
from tbl_pas_scan_seq
where to_wc='A201'
這種方式的好處在於,可自行控制臨時表的結構。
2)用select into table,在建立的同時批量寫入數據,如:
select distinct ltrim(rtrim(line_no)) into #tbl_Line
from tbl_pas_scan_seq
where to_wc='A201'
這種方式的好處在於快捷,臨時表結構依賴於From子句中的相應表和欄位,當然select 子句中對欄位的處理也會有影響。
3) 利用with語句(sql server 2005+版本)
with test(bucode, bunamech)
as
(
select buCode,bunamech from pubBU
)
select * from TEST --- 此時的test就是臨時表,後續語句可以直接引用
『叄』 如何實現SQL Server臨時表的創建
創建
臨時表
方法一:
create
table
#臨時表名(欄位1
約束條件,
欄位2
約束條件,
.....)
create
table
##臨時表名(欄位1
約束條件,
欄位2
約束條件,
.....)
方法二:
select
*
into
#臨時表名
from
你的表;
select
*
into
##臨時表名
from
你的表;
註:以上的#代表局部臨時表,##代表全局臨時表
查詢臨時表
select
*
from
#臨時表名;
select
*
from
##臨時表名;
刪除臨時表
drop
table
#臨時表名;
drop
table
##臨時表名;
『肆』 SQL臨時表的創建
select 表1名. 欄位名,表2名.欄位名 into 新表名from 表1,表2where 條件
『伍』 sql如何創建臨時表
網上其實很多相關文章,你可以搜一下,並不一定需要在這里提問。
轉帖一篇給你吧
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 約束中不能引用臨時表。
考慮使用表變數而不使用臨時表。當需要在臨時表上顯式地創建索引時,或多個存儲過程或函數需要使用表值時,臨時表很有用。通常,表變數提供更有效的查詢處理。
『陸』 sql 創建臨時表
表名前使用一個#號,臨時表是局部的,使用兩個#號,臨時表是全局的,在斷開連接後sql會自動刪除臨時表
create table #a
(
id int,
name varchar(50)
)
insert into #a(id,name) values(1,'123')
select * from #a
drop table #a
臨時表除了名稱前多了#號外,其他操作與普通表完全一樣。
tb_Student是已建立好的表,我們通過臨時表temp把tb_Student表中的內容復制到tb_lizi表中,可以使用如下的代碼實現:
use mcf
SELECT * INTO #temp FROM tb_Student
SELECT * INTO tb_lizi FROM #temp
執行後斷開sql連接並重新連接(也可以退出sq再l重新啟動sql),發現tb_lizi表中的內容tb_Student表中的內容完全一致,實現了復制,同時我們沒有用代碼刪除temp表,但mcf資料庫中卻沒有temp表了,這是因為斷開連接時sql自動刪除了temp表
希望能解決您的問題。
『柒』 SQL 創建一個臨時表#tabletemp 裡面有兩個欄位「cn」和「dt」分別用來存儲另一個表的欄位名和數據類型。
提到MySQL臨時表,我們都很熟悉了,一般來說,分為兩類:
1. MySQL 臨時表引擎,名字叫做 Memory。比如
create table tmp1(id int, str1 varchar(100) ) engine = memory;
由參數max_heap_table_size 來控制,超過報錯。
2. 非臨時表的引擎,這里又分為兩類:
用戶自定義的臨時表,比如:
- create temporary table (id int, str1 varchar(100) );
SQL執行過程中產生的內部臨時表,比如:UNION , 聚合類ORDER BY,派生表,大對象欄位的查詢,子查詢或者半連接的固化等等場景。
- mysql> show status like '%tmp_%tables%';``+-------------------------+-------+``| Variable_name | Value |``+-------------------------+-------+``| Created_tmp_disk_tables | 0 |``| Created_tmp_tables | 0 |``+-------------------------+-------+``2 rows in set (0.00 sec)
VARCHAR的變長存儲。那就是如果臨時表的欄位定義是 VARCHAR(200),那麼映射到內存里處理的欄位變為CHAR(200)。假設 VARCHAR(200) 就存里一個字元 "Y", 那豈不是很大的浪費。
大對象的默認磁碟存儲,比如 TEXT,BLOB, JSON等,不管裡面存放了啥,直接轉化為磁碟存儲。
- mysql> SELECT * FROM performance_schema. memory_summary_global_by_event_name WHERE event_name like '%temptable%'G*************************** 1. row *************************** EVENT_NAME: **memory/temptable/physical_disk** COUNT_ALLOC: 0 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 0 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 0 HIGH_COUNT_USED: 0 LOW_NUMBER_OF_BYTES_USED: 0CURRENT_NUMBER_OF_BYTES_USED: 0 HIGH_NUMBER_OF_BYTES_USED: 0*************************** 2. row *************************** EVENT_NAME: **memory/temptable/physical_ram** COUNT_ALLOC: 1 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 1048576 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 1 HIGH_COUNT_USED: 1 LOW_NUMBER_OF_BYTES_USED: 0CURRENT_NUMBER_OF_BYTES_USED: 1048576 HIGH_NUMBER_OF_BYTES_USED: 10485762 rows in set (0.03 sec)
默認內部臨時表引擎。
支持變長字元類型的實際存儲。
設置變數 temp_table_max_ram 來控制實際存儲內存區域大小。
那麼這兩種臨時表的計數器通常用show global status like '%tmp_%tables%' 來查看。比如
以上結果分別代表,只創建磁碟上的臨時表計數以及臨時表的總計數。這兩個計數器由參數 tmp_table_size 和 max_heap_table_size 兩個取最小值來控制。
那在 MySQL 5.7 之前,這個 SQL 運行中產生的臨時表是 MYISAM,而且只能是 MYISAM。那 MySQL 從 5.7 開始提供了參數 Internal_tmp_mem_storage_engine 來定義內部的臨時表引擎,可選值為 MYISAM 和 INNODB 。當然這里我們選擇 INNODB 。並且把內部的臨時表默認保存在臨時表空間 ibtmp1 (可以用參數 innodb_temp_data_file_path 設置大小以及步長等)下。當然這里我們得控制下 ibtmp1 的大小,要不然一個爛SQL就把磁碟整爆了。
但是MySQL 5.7 之前都沒有解決如下問題:
MySQL 8.0 開始,專門實現了一個臨時表的引擎 TempTable , 解決了 VARCHAR欄位的邊長存儲以及大對象的內存存儲。由變數 interal_tmp_mem_storage_engine來控制,可選值為 TempTable(默認)和 Memory;新引擎的大小由參數temp_table_max_ram 來控制,默認為1G。超過了則存儲在磁碟上(ibtmp1)。並且計數器由性能字典的表 memory_summary_global_by_event_name 來存儲。
以上 memory/temptable/physical_disk 代表放入磁碟上的臨時表計數情況。
memory/temptable/physical_ram 代表放入內存的臨時表計數情況。
那總結下MySQL 8.0 引入的 TempTable 引擎:
『捌』 sql中怎樣將查詢出來的結果創建成臨時表
其實視圖最典型的用途就是這樣了,做起來也比較容易,不過樓主要求臨時表,那麼就試試吧,一般來說數據量大的用錶快,不然就建視圖,不知道樓主是用什麼資料庫的呢? 如果是ms sql server的話可以:
SELECT * INTO #TEMPTABLENAME
FROM
(
SELECT xxxxxx //你的查詢語句
)AS table_source //這個別名是必須的
WHERE xxxxxxxx //你需要的where判斷
;
COMMIT或ROLLBACK後可自動刪除該臨時表
可以參考
等網址
『玖』 SQL怎麼創建一個臨時表
創建臨時表
方法一:
create table #臨時表名(欄位1 約束條件,
欄位2 約束條件,
.....)
create table ##臨時表名(欄位1 約束條件,
欄位2 約束條件,
.....)
方法二:
select * into #臨時表名 from 你的表;
select * into ##臨時表名 from 你的表;
註:以上的#代表局部臨時表,##代表全局臨時表
查詢臨時表
select * from #臨時表名;
select * from ##臨時表名;
刪除臨時表
drop table #臨時表名;
drop table ##臨時表名;
『拾』 SQL如何把查詢出來的多個表創建成一個臨時表
SELECT * INTO #TEMPTABLENAME
FROM
(
SELECT xxxxxx //你的查詢語句
)AS table_source //這個別名是必須的
WHERE xxxxxxxx //你需要的where判斷;
COMMIT或ROLLBACK後可自動刪除該臨時表
1、sql server使用select into會自動生成臨時表,不需要事先創建。
select * into #temp from sysobjects
2、sql要把多個表合並成一個要用到union或union all的關鍵字。
3、union或union all的區別是:union會自動壓縮多個結果集合中的重復結果,而union all則將所有的結果全部顯示出來。
(10)sql動態創建臨時表擴展閱讀
sql語言特點如下:
1、一體化:SQL集數據定義DDL、數據操縱DML和數據控制DCL於一體,可以完成資料庫中的全部工作。
2、使用方式靈活:它具有兩種使用方式,即可以直接以命令方式交互使用;也可以嵌入使用,嵌入到C、C++、FORTRAN、COBOL、JAVA等主語言中使用。
3、語言簡潔,語法簡單,好學好用:在ANSI標准中,只包含了94個英文單詞,核心功能只用6個動詞,語法接近英語口語。