A. sql Server 表變數和臨時表的區別
臨時表、表變數的比較
1、臨時表
臨時表包括:以#開頭的局部臨時表,以##開頭的全局臨時表。
a、存儲
不管是局部臨時表,還是全局臨時表,都會放存放在tempdb資料庫中。
b、作用域
局部臨時表:對當前連接有效,只在創建它的存儲過度、批處理、動態語句中有效,類似於C語言中局部變數的作用域。
全局臨時表:在所有連接對它都結束引用時,會被刪除,對創建者來說,斷開連接就是結束引用;對非創建者,不再引用就是結束引用。
但最好在用完後,就通過drop table 語句刪除,及時釋放資源。
c、特性
與普通的表一樣,能定義約束,能創建索引,最關鍵的是有數據分布的統計信息,這樣有利於優化器做出正確的執行計劃,但同時它的開銷和普通的表一樣,一般適合數據量較大的情況。
有一個非常方便的select ... into 的用法,這也是一個特點。
2、表變數
a、存儲
表變數存放在tempdb資料庫中。
b、作用域
和普通的變數一樣,在定義表變數的存儲過程、批處理、動態語句、函數結束時,會自動清除。
c、特性
可以有主鍵,但不能直接創建索引,也沒有任何數據的統計信息。表變數適合數據量相對較小的情況。
必須要注意的是,表變數不受事務的約束,
B. 關於SQL觸發器的問題 同時刪除多行,這些行插入到另一張表中
同時刪除多行,把這些刪除的行插入到另一張表中還學要的什麼條件么?
直接獲取deleted內的刪除數據插入到目標表中就好了吧?如下試試?
CREATE TRIGGER [dbo].[classlist_delete]
ON [dbo].[classlist]
AFTER DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF EXISTS(SELECT 1 FROM DELETED)--存在刪除
BEGIN
BEGIN TRY
BEGIN TRAN --開始事務
--執行插入
insert into delclasslist(StuID,Student,fid,StuClass,Teacher,CTime,
Term,Remark,ispay,absent,cid)
select StuID,Student,fid,StuClass,Teacher,CTime,Term,Remark,ispay,absent,id
from deleted
COMMIT TRAN --提交事務
END TRY
BEGIN CATCH
--如果插入失敗,則回滾事物
IF XACT_STATE()<>0
ROLLBACK TRAN
END CATCH
END
END
---------------------------------------------
MS-SQL SERVER2005及以上版本用output子句便可以實現在刪除時便可以往另一張表中插入刪除信息:如下例子:
--------------------1、INSERT+OUTPUT子句----------------------
--演示表變數
DECLARE @T TABLE(ID INT)
--在INSERT語句中使用OUTPUT子句
INSERT @T
OUTPUT inserted.ID
SELECT object_id
FROM sys.objects O
-----------------2、UPDATE+OUTPUT子句-----------
--更新:先刪後改
UPDATE A
SET ID=O.object_id+2
OUTPUT O.name,deleted.ID AS ID_BEFORE_UPDATE,inserted.ID AS ID_AFTER_UPDATE
FROM @T A,sys.objects O
WHERE A.ID=O.object_id
--SELECT * FROM sys.objects
-----------------3、DELETE+OUTPUT子句-----------
--用於保存輸出結果的表變數
DECLARE @RE TABLE(
ID INT,
NAME VARCHAR(100)
--NAME SYSNAME
)
--刪除
DELETE A
OUTPUT DELETED.ID,'被刪除的ObjectName:'+O.name
INTO @RE
FROM @T A,sys.objects O
WHERE A.ID=O.object_id
--顯示結果
SELECT * FROM @RE
C. sql 根據ID循環刪除行
--可以將字元串分解成行插入到一個表變數
--然後根據ID 刪除要刪除的數據
--
--
--這是以前CSDN大版主鄒建 寫的一個方法,很好很強大
/*
分解公式
將公式按運算分解到表中
*/
declare @str varchar(100)
declare @i int,@str1 varchar(10),@str2 varchar(10)
set @str='1,2,3,4' --要分解的字元串
declare @tb table(num varchar(20),operation varchar(2)) --定義保存結果的表
--公式分拆
set @i=patindex('%[^0-9]%',@str)
while @i>0
begin
select @str1=left(@str,@i-1)
,@str=substring(@str,@i,8000)
,@i=patindex('%[0-9]%',@str)
,@str2=left(@str,@i-1)
,@str=substring(@str,@i,8000)
,@i=patindex('%[^0-9]%',@str)
insert into @tb values(@str1,@str2)
end
if @str<>'' insert into @tb values(@str,'')
--顯示分拆結果
select * from @tb
--刪除就這樣 @tb一定要取個別名
DELETE TabelName
FROM @tb AS TA
WHERE TabelName.ID = TA.ID
以上是SQLSERVER 寫法 希望對你有幫助
D. sql2005中臨時表#table和表變數@table有什麼不同呀
我記得以前在哪些地方看到過。
表變數和臨時表是兩個不同的東西,但是他們是可以用於一些共同的用途的。不過要注意一下使用的場景。
臨時表
臨時表有兩種類型:本地表和全局表。本地臨時表的名稱都是以「#」為前綴,全局臨時表的名稱都是以「##」為前綴。臨時表的訪問是有可能造成物理IO的。臨時表可以有索引、數據統計這些。
表變數
表變數是變數的一種,表變數也分為本地及全局的兩種。表變數存放在內存中,但是並不是沒有限制而是有一定限制的,如果表變數數據量超過閾值,會把內存耗盡,然後使用硬碟空間,這時再訪問他就會增加了內存調入調出的機會,反而降低速度。表變數是不能有索引的。
大概就是這些,其他的記不住了。
E. sql臨時表表變數的使用方法與什麼時候用最好
臨時表、表變數的比較
1、臨時表
臨時表包括:以#開頭的局部臨時表,以##開頭的全局臨時表。
a、存儲
不管是局部臨時表,還是全局臨時表,都會放存放在tempdb資料庫中。
b、作用域
局部臨時表:對當前連接有效,只在創建它的存儲過度、批處理、動態語句中有效,類似於C語言中局部變數的作用域。
全局臨時表:在所有連接對它都結束引用時,會被刪除,對創建者來說,斷開連接就是結束引用;對非創建者,不再引用就是結束引用。
但最好在用完後,就通過drop table 語句刪除,及時釋放資源。
c、特性
與普通的表一樣,能定義約束,能創建索引,最關鍵的是有數據分布的統計信息,這樣有利於優化器做出正確的執行計劃,但同時它的開銷和普通的表一樣,一般適合數據量較大的情況。
有一個非常方便的select ... into 的用法,這也是一個特點。
2、表變數
a、存儲
表變數存放在tempdb資料庫中。
b、作用域
和普通的變數一樣,在定義表變數的存儲過程、批處理、動態語句、函數結束時,會自動清除。
c、特性
可以有主鍵,但不能直接創建索引,也沒有任何數據的統計信息。表變數適合數據量相對較小的情況。
必須要注意的是,表變數不受事務的約束,
F. SQL用一個變數來代表多個表,所有操作都直接對這個表變數進行操作,省去反復修改表名的麻煩,如何編寫
一個表變數只能存一個表的數據,不能多個的
G. 關於SQL一些常用語句
(1) 數據記錄篩選:
sql="select * from 數據表 where 欄位名=欄位值 order by 欄位名 "
sql="select * from 數據表 where 欄位名 like 『%欄位值%『 order by 欄位名 "
sql="select top 10 * from 數據表 where 欄位名 order by 欄位名 "
sql="select * from 數據表 where 欄位名 in (『值1『,『值2『,『值3『)"
sql="select * from 數據表 where 欄位名 between 值1 and 值2"
(2) 更新數據記錄:
sql="update 數據表 set 欄位名=欄位值 where 條件表達式"
sql="update 數據表 set 欄位1=值1,欄位2=值2 …… 欄位n=值n where 條件表達式"
(3) 刪除數據記錄:
sql="delete from 數據表 where 條件表達式"
sql="delete from 數據表" (將數據表所有記錄刪除)
(4) 添加數據記錄:
sql="insert into 數據表 (欄位1,欄位2,欄位3 …) valuess (值1,值2,值3 …)"
sql="insert into 目標數據表 select * from 源數據表" (把源數據表的記錄添加到目標數據表)
(5) 數據記錄統計函數:
AVG(欄位名) 得出一個表格欄平均值
COUNT(*|欄位名) 對數據行數的統計或對某一欄有值的數據行數統計
MAX(欄位名) 取得一個表格欄最大的值
MIN(欄位名) 取得一個表格欄最小的值
SUM(欄位名) 把數據欄的值相加
引用以上函數的方法:
sql="select sum(欄位名) as 別名 from 數據表 where 條件表達式"
set rs=conn.excute(sql)
用 rs("別名") 獲取統的計值,其它函數運用同上。
(5) 數據表的建立和刪除:
CREATE TABLE 數據表名稱(欄位1 類型1(長度),欄位2 類型2(長度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 數據表名稱 (永久性刪除一個數據表)
(6) 記錄集對象的方法:
rs.movenext 將記錄指針從當前的位置向下移一行
rs.moveprevious 將記錄指針從當前的位置向上移一行
rs.movefirst 將記錄指針移到數據表第一行
rs.movelast 將記錄指針移到數據表最後一行
rs.absoluteposition=N 將記錄指針移到數據表第N行
rs.absolutepage=N 將記錄指針移到第N頁的第一行
rs.pagesize=N 設置每頁為N條記錄
rs.pagecount 根據 pagesize 的設置返回總頁數
rs.recordcount 返回記錄總數
rs.bof 返回記錄指針是否超出數據表首端,true表示是,false為否
rs.eof 返回記錄指針是否超出數據表末端,true表示是,false為否
rs.delete 刪除當前記錄,但記錄指針不會向下移動
rs.addnew 添加記錄到數據表末端
rs.update 更新數據表記錄
判斷所填數據是數字型
if not isNumeric(request("欄位名稱")) then
response.write "不是數字"
else
response.write "數字"
end if
H. sql 表變數 的定義
你可以用臨時表
select top 0 * into #table from table
那就沒辦法了,只能你自己一個一個寫了,欄位少還好說,要是多的話
你就在你原表上點擊生成一個腳本往方法里粘貼吧
I. SQL SERVER怎麼去掉重復數據
首先,你的表設計就有問題。存在兩行完全相同的數據。在設計表時,要設計一個primary key,主鍵。在維護數據方面,比較方便。
你用臨時表,表變數的方式臨時存儲數據。再更新表內容。
用關鍵字distinct過濾掉重復的記錄
select distinct * #t from a
insert into a
select * from #t
drop table #t
這樣能除去重復的數據。
根據你的描述,group by 都不用了。
J. sql清空臨時表
你這不是臨時表
create table #tempTable (id int identity(1,1),name varchar(20))
insert into #temptable(name)values('1')
insert into #temptable(name)values('1')
insert into #temptable(name)values('1')
select * from #temptable--看這里id是從1開始的
delete #temptable
DBCC CHECKIDENT (#temptable, RESEED, 0)--關鍵
insert into #temptable(name)values('2')
insert into #temptable(name)values('3')
insert into #temptable(name)values('3')
select * from #temptable--id重新從1開始