在SQL2005中T-SQL的增強部分

(1) Error Handling
SQL Server2000沒有這種Try-Catch 工具,古人們只好用檢查@@Error變量的辦法來看看出沒出錯. 現在技術先進了,這樣寫就可以了
BEGIN TRY
BEGIN TRANSACTION
一些Code
END TRANSACTION
END TRY
BEGIN CATCH
處理的Code
END CATCH

處理的Code可以使用下列函數,
ERROR_NUMBER():錯誤代號
ERROR_SEVERITY(): 錯誤等級
ERROR_STATE(): 錯誤狀態
ERROR_MESSAGE():信息
ERROR_LINE():行號
ERROR_PROCEDURE(): Procedure的名字
XACT_STATE(): Transaction的狀態. 0正常,1 出錯
RAISEERROR():如果感覺很嚴重,可以重新把Error放出去,由上級處理.

(2) 新加的Intersect和Except
就是放在兩組Select語句之間,看交集和補集的. 使用了這個語句之後,Group By, Having 只能用在各個Select的子集中, Order By只管最後的結果.

(3) Top 子句在2005中,可以用在Delete, Update, Insert中. 從前用在Select中的時候,表示前幾名的意思, Top(10) with Ties 之類. 注意,一定要打括號.

(4) Output 命令
等於可以塞在Insert, Delete, Update中的Select, 返回一個表,這樣可以眼睜睜的看見什麼東西被改了,改成什麼了. Output語句位置可以放在這些語句的中間, 返回值就是執行完畢的,但是又沒有觸發Trigger那個時刻. 有兩個臨時Table可以用,一個是Inserted, 一個是Deleted. Insert命令沒有Deleted 表,Delete命令沒有Inserted表, Update命令兩個表都有.
比如:
Insert into 某某表
Output Inserted.某某列 as [輸出表頭的名字], Inserted.其他列
Value(XXX)
注意上個例子中的點號和逗號.

(5) Outer Apply  Cross Apply
這個和outer join, cross join 實現相同的功能, 唯一的區別是不需要寫Where語句. 由Sql Server自動找到同名的項,然後Join起來.

(6) CTE (Common Table Express)
就是生成臨時Table那種, 基本格式是With 臨時表的名字(參數名) AS (Select 語句 ), 另一個With句, Select 語句.
例如:

With 表1 (列1, 列2) As ( Select id, name from student)
With 表2 As (Select teacher from school)
Select 表1.列1 From 表1 inner join 表2

無意中看到一個有趣的When Then  Else- End As 列名, 用法.
就是在Select語句中根據某個標準輸出不同的String.比如,根據成績,寫上及格通過什麼的.
比如:
Select ID
CASE
When ID in 大俠表
Then 大俠
Else 草民
End As 身份
From
全體人員表

輸出的標題就是 ID 和 身份,然後底下根據各人ID列出身份.

(7) 遞歸查詢
遞歸就是反覆調用自身. 看起來費勁,其實很簡單,就是CTE的一個應用而已. 基本原則就是定義一個表,然後在內部的Select語句中重複引用這個表名,就是了. 可以藉助於Union 關鍵詞來構成. 比如
With 某表1 As
(
Select 語句
Union
Select 語句 From 某表2
Join
某表1
)

(8) Pivot 和Unpivot進行行列轉換

Pivot的行列轉換就是把每行的數據變成列. 一個一維的表變成2維, 比如一個表吧,每一行是每天每種產品的銷售額. 想變成二維表看看一週七天每種產品的銷量,就要用到Pivot.
Unpivot就是和Pivot逆轉, 把二維表攤平變成一維表.
比如, 有一個數據庫的表, 統計產品數量. 列包括,產品編號, 時間,數量. Pivot之後,就把時間轉換成列, 產品編號變成行, 然後新的列就是幾個時間段, 每行是一個產品編號的數量.
Unpivot就是把第二個表變回第一個表

http://ningoo.itpub.net/post/2149/281485

(9) Ranking  Partitioning

Ranking 就是排序.給每個數據一個排名. 通常的用法是
Select ROW_NUMBER() OVER (ORDER BY ID) AS [ROW NUMBER]
FROM XXX

其中, ROW_NUMBER()是個Ranking函數,類似的函數還有一批, Over是必配的關鍵詞, 後面接一個Order By的語句, 然後是其他的From 語句

除了Row_Number這種很不精確的東西之外, 還可以用Rank, Dense_rank, Ntile來取值.Rank就是從1開始排序,相同值可以以任何序列出現, Dense_Rank就是相同值給定一個相同的Rank,就是允許並列的意思. Ntile就是分成幾個小片,
用法是Ntile(某個數) 這裏某個數就是分成多少個小片的意思.

Partitioning就是分成幾個區,每個區都從頭開始數,就是每次都從1開始.
用法是在Over後面的括號里加一個Partition By語句
Select Row_number() over (
Partition By 某某列,
Order By 某某列

)

10. Table 採樣
關鍵詞是TableSample
Select 某某東西 From 某某表
Tablesample System (10)

Tablesample後面跟一個數,表示取樣百分之幾的意思. 也可以寫Tablesample(10 Percent) 或者Tablesample(100 Rows)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章