SQL語句中如何將字符串轉成臨時表
方式一:通過charindex和substring。
create function func_splitstring (@str nvarchar(max),@split varchar (10)) returns @t Table (c1 varchar(100)) as begin declare @i int declare @s int set @i=1 set @s=1 while(@i>0) begin set @i=charindex(@split,@str,@s) if(@i>0) begin insert @t(c1) values(substring(@str,@s,@i-@s)) end else begin insert @t(c1) values(substring(@str,@s,len(@str)-@s+1)) end set @s = @i + 1 end return end 執行:select * from dbo。 func_splitstring('1,2,3,4,5,6', ',') 結果: 方式二:通過XQuery(需要SQL Server 2005以上版本)。
create function func_splitid (@str varchar(max),@split varchar (10)) RETURNS @t Table (c1 int) AS BEGIN DECLARE @x XML SET @x = CONVERT(XML,'') INSERT INTO @t SELECT x。 item。
value('@id[1]', 'INT') FROM @x。nodes('//items/item') AS x(item) RETURN END 執行:select * from dbo。
func_splitid('1,2,3,4,5,6', ',')。
sqlserver怎么建臨時表
網上其實很多相關文章,你可以搜一下,并不一定需要在這里提問。
轉帖一篇給你吧 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 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語句刪除臨時表的方法:
一、刪除語句:
drop table #臨時表名;
drop table ##臨時表名;二、#代表局部臨時表,##代表全局臨時表
局部臨時表
以一個井號 (#) 開頭的那些表名。只有在創建本地臨時表的連接上才能看到這些表。
全局臨時表
以兩個井號 (##) 開頭的那些表名。在所有連接上都能看到全局臨時表。如果在創建全局臨時表的連接斷開前沒有顯式地除去這些表,那么只要所有其它任務停止引用它們,這些表即被除去。當創建全局臨時表的連接斷開后,新的任務不能再引用它們。當前的語句一執行完,任務與表之間的關聯即被除去;因此通常情況下,只要創建全局臨時表的連接斷開,全局臨時表即被除去。
三、創建臨時表的方法
方法1,創建一個沒有數據的臨時表:
create table #臨時表名(字段1 約束條件,字段2 約束條件,。..)
create table ##臨時表名(字段1 約束條件,字段2 約束條件, 。..)
例:
create table #table_temp (xh int,test_column char(10));方法2,以表格檢索結果創建臨時表:
select * into #臨時表名 from 表名;
select * into ##臨時表名 from 表名;
例:
select * into #table_temp from tt;四、檢索臨時表數據,與普通表格一樣
select * from #臨時表名;
select * from ##臨時表名;
SQL臨時表使用
視圖是邏輯層面上的
就像你是1 班的. 而你又是學生會的. 那么. 學生會這邊就不必再為你而新建信息. 它只要求能夠指向你所在班級就可以了. 也就是說.你還是你. 只不過看的角度不同了.
它與臨時表沒有什么聯系.
臨時表 故名思義 ,它是臨時的. 你與數據連接后,也就是產生了一個Session.
這個時候,我們可以創建一張臨時性質的表 它與真正的表沒有什么區別
,但是這張表就不會存儲到正常的表空間中去,而是被臨時放置而已.等到你斷開數據庫后,所謂的臨時表的一切信息都會被丟棄.
形象一點,就像你打開了電腦,登陸了一個用戶,存在硬盤上的東西是永久的(相當于表),而內存中的數據是臨時的(相當于臨時表),一旦你重啟了.那么內存中的數據都會被丟掉.而硬盤上的數據依然還在.
不同的數據庫,對臨時表的操作在語法上會有一些不同
僅舉一例:
declare @t1 table (
id int primary key,
name nvarchar(20),
tel nvarchar(20)
)
insert into @t1 values(1,'aa','123')
insert into @t1 values(2,'bb','234')
insert into @t1 values(3,'cc','567')
--select * from @t1
SQL中系統臨時表的使用和禁忌有哪些
以前在SQL 中寫SP 時,如比較復雜時,喜歡中間使用臨時表來暫存相關記錄,這樣的好處有很多,提高效率,提高程序的可讀性等。
當然后臨時表的使用,一般均會使用用戶臨時表,即 #TempTable, 但有一些情況下,偶爾也會使用系統臨時表,即 ##TempTable。 兩種臨時表的的使用語法差不多,可用幾種方法來建立,可 Create ,也可 Select Into 。
當然關鍵的是系統臨時表和用戶臨時表的區別:(如下) 1)用戶臨時表:用戶臨時表的名稱以單個數字符號(#)開頭; 用戶臨時表只對創建這個表的用戶的Session可見,對其他進程是不可見的。 當創建它的進程消失時這個臨時表就自動刪除。
2)系統臨時表:系統臨時表的名稱以數字符號(##)開頭 全局臨時表對整個SQL Server實例都可見,但是所有訪問它的Session都消失的時候,它也自動刪除。 明白了這些就知道了他們的用途和限制,但有一些地方還是容易出問題,故在此專門列出。
1, 在使用 Exec(SQLScript) 執行Script 時,其間也相當于單獨有一個進程處理,故執行期間內如果創建用戶臨時表的話,在執行完成后也就結束了,即執行完成后,你不可以使用在 SQLScript 中生成的用戶臨時表,可以用系統臨時表代替。 2, 在使用用戶臨時表時,有一個問題要注意,就是最好在建立時指定其用戶為 dbo ,以避免可能的問題; 3, 在使用系統臨時表時,一定要考慮到,不可以將其用于多用戶使用的環境功能或系統中,否則就可能出現沖突的問題,導致結果不可預料。
如果在多用戶使用的環境中使用系統臨時表,則可能會出現多個用戶同時對同一系統臨時表進行處理,從而導致沖突和數據的錯誤。 以前沒有注意這一點,我就因此而浪費過不少的時間。
有時需要使用Exec(SQLScript)方式產生數據,但其中只能使用系統臨時表,如何處理呢? 1, 考試大提示可以預先定義好一個用戶臨時表,然后使用 Insert #TempTable Exec(SQLScript) 的方式,即可將Exec 產生的結果記錄加入用戶臨時表,從而避免使用系統臨時表; 2, 從根本上避免使用 Exec() ,可用其它方式代替。 Exec() 的使用是因為有一些 Script 比較復雜,其中需要一些組合字符,如 in ('','','') 或其它可能的情況,在此情況,無法直接使用一般的Script 產生記錄,只能先產生一個組合的Script ,然后用Exec 執行。
怎么用SQL語句建立臨時表與系統臨時表(最好告訴我具體語法),
我估計你想問的是本地臨時表和全局臨時表。
SQL Server 支持臨時表。臨時表就是那些名稱以井號 (#) 開頭的表。如果當用戶斷開連接時沒有除去臨時表,SQL Server 將自動除去臨時表。臨時表不存儲在當前數據庫內,而是存儲在系統數據庫 tempdb 內。
臨時表有兩種類型:
本地臨時表:本地臨時表的名稱以單個數字符號 (#) 打頭;它們僅對當前的用戶連接是可見的;當用戶從 Microsoft SQL Server 2000 實例斷開連接時被刪除。
全局臨時表:全局臨時表的名稱以數學符號 (##) 打頭,創建后對任何用戶都是可見的。如果在創建全局臨時表的連接斷開前沒有顯式地除去這些表,那么只要所有其它任務停止引用它們,這些表即被除去。當創建全局臨時表的連接斷開后,新的任務不能再引用它們。當前的語句一執行完,任務與表之間的關聯即被除去;因此通常情況下,只要創建全局臨時表的連接斷開,全局臨時表即被除去。
例如,如果創建名為 employees 的表,則任何人只要在數據庫中有使用該表的安全權限就可以使用該表,除非它已刪除。如果創建名為 #employees 的本地臨時表,只有您能對該表執行操作且在斷開連接時該表刪除。如果創建名為 ##employees 的全局臨時表,數據表中的任何用戶均可對該表執行操作。如果該表在您創建后沒有其他用戶使用,則當您斷開連接時該表刪除。如果該表在您創建后有其他用戶使用,則 SQL Server在所有用戶斷開連接后刪除該表。
現在,臨時表的許多傳統用途可由具有 table 數據類型的變量替換。
下面是例子。。
select * into #temptable from tablename
#連接斷開后自動釋放
在sql中建立臨時表
create table #tablename (。..) 局部
create table ##tablename(。..) 全局
select * into #tablename 。..
select * into ##tablename 。.
insert into #tablename 。.
insert into ##tablename 。.