SQL Server 2012 – What’s new in T-SQL (SQL 152)
開始練習Lab時,請先參考「使用SQL Server Virtual Labs注意的地方」。
主題:SQL Server 2012 – What’s new in T-SQL (SQL 152)
SQL Server 2012 T-SQL有那些新的東西呢? 以下跟著Lab(SQL Server 2012 – What’s new in T-SQL (SQL 152) )來體驗看看吧!
Exercise 1: Sequences
PS.開啟Lab中的Script檔時,請將 Adventureworks Replace成 Adventureworks2012 (因Lab的VM的DB是Adventureworks2012)。
--Create the Test schema
CREATE SCHEMA Test;
-- 建立一個 SEQUENCE 從1開始,每次遞增1
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1;
-- 透過NEXT VALUE來取下一個流水號
SELECT NEXT VALUE FOR Test.CountBy1;
SEQUENCE 也可以用在不同的Table中的欄位當預設值,如下
CREATE SCHEMA Audit;
CREATE SEQUENCE Audit.EventCounter
AS int
START WITH 1
INCREMENT BY 1;
CREATE TABLE Audit.ProcessEvents
(
EventID int PRIMARY KEY CLUSTERED DEFAULT (NEXT VALUE FOR Audit.EventCounter)
, EventTime datetime NOT NULL DEFAULT (getdate())
, EventCode nvarchar(5) NOT NULL
, Description nvarchar(300) NULL
) ;
也可以設定到了最大值時,就重新從最小值開始一直重覆,如下,
CREATE SEQUENCE CountBy5
AS tinyint
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 5
CYCLE;
SELECT NEXT VALUE FOR CountBy5
SELECT NEXT VALUE FOR CountBy5 AS SurveyGroup, Name
FROM sys.objects;
可以依某個排序來遞增流水號NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name)
可透過 ALTER SEQUENCE 重新設定初始值
Lab VM 最後是將原本欄位是Identity 改成使用 SEQUENCE,透過新增欄位及刪除舊欄位及改欄位名稱。
Exercise 2: PAGING windows in T-SQL
之前要做到取資料的分頁需要透過ROW_NUMBER() + ORDER BY + BETWEEN 來取得資料中第N頁的資料,SQL 2000時,還更麻煩!
現在有了OFFSET/FETCH NEXT + ORDER BY 要將資料分頁取資料語法就更簡單了。
Exercise 3: Exception Handling in SQL Server 2012
SQL 2012中可透過TRY/CATCH來Handle錯誤。
Exercise 4: New Functions in SQL Server 2012
Task 1: String Manipulation using CONCAT
CONCAT可將要串接的資料串成字串輸出
Task 2: FORMAT function
Task 3: Logical functions IIF and CHOOSE
SELECT CHOOSE ( 3, 'Manager', 'Director', 'Developer', 'Tester' ) AS Result; --Developer
DECLARE @a int = 45; DECLARE @b int = 40; SELECT IIF ( @a > @b, 'TRUE', 'FALSE' ) AS Result; --TRUE
Task 4: TRY_CONVERT function in SQL Server 2012
如果轉換成功,會傳回轉換為指定之資料類型的值;否則會傳回 Null。所以有時我們在做資料轉入時,可透過這種方式來找出那些資料無法轉入。
SELECT CASE WHEN TRY_CONVERT(float, 'test') IS NULL
THEN 'Cast failed'
ELSE 'Cast succeeded'
END AS Result; -- Cast failed
另外,Lead/Lag 對於在前後期比較也很有幫助哦!
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^