#眉標=SQL Server 2008 #副標=SQL Server 2008功能初體驗 #大標=Transact-SQL新功能 #作者=文/圖 楊志強 ============= 陳述式1 USE tempdb GO --判斷是否存在,進行刪除 if exists(select * from sys.tables where name='Stock') drop table Stock; go --庫存的資料表 CREATE TABLE Stock (Stock VARCHAR(30) PRIMARY KEY, --產品 Qty INT CHECK(Qty > 0)); --總數量 --判斷是否存在,進行刪除 if exists(select * from sys.tables where name='Trades') drop table Trades; go --採購的資料表 CREATE TABLE Trades (Stock VARCHAR(30) PRIMARY KEY, --產品 Delta INT); --新增數量 GO --新增庫存資料 INSERT Stock VALUES ('SQL Server' , 10); INSERT Stock VALUES ('VISTA' , 5); --新增採購記錄 --表示採購個 INSERT Trades VALUES ('SQL Server' , 5); --表示退回個 INSERT Trades VALUES ('VISTA' , -5); --表示採購個 INSERT Trades VALUES ('Visual Studio ', 3); GO================ ============= 陳述式2 MERGE Stock S -- 目的資料表(庫存) USING Trades T -- 來源資料表(採購) ON S.Stock = T.Stock WHEN MATCHED AND (Qty + Delta = 0) THEN DELETE -- 假如總體庫存=0 ,就刪除該筆庫存 WHEN MATCHED THEN UPDATE SET Qty = Qty + Delta -- 累加庫存 WHEN NOT MATCHED THEN INSERT VALUES (Stock, Delta) -- 新採購商品,進行新增 -- 輸出INSERT/UPDATE/DELETE 作業動作 -- 使用OUTPUT與$action 表示哪種DML執行動作 OUTPUT $action, inserted.Stock, deleted.Stock; GO================ ============= 陳述式3 --宣告承接唯一識別碼的資料 DECLARE @TID TABLE ([唯一識別碼] uniqueidentifier) --宣告員工資料表值變數 DECLARE @Employees TABLE ([唯一識別碼] uniqueidentifier DEFAULT NEWID() , --唯一識別值 EmpName varchar(30) , --員工姓名 Age INT, --年齡 EmpId INT NOT NULL UNIQUE) --員工編號 --使用多筆資料新增的新功能 INSERT INTO @Employees(EmpName,Age,EmpId) OUTPUT INSERTED.[唯一識別碼] INTO @TID VALUES ('阿萳', 25, 5) , ('阿麗', 30, 6) , ('阿強', 99, 9) --查詢輸出的唯一識別碼 SELECT * FROM @TID --輸出員工資料表 SELECT * FROM @Employees================ ============= 陳述式4 --建立資料表值類型 CREATE TYPE myTableType AS TABLE (id INT, name NVARCHAR(100), qty INT); GO================ ============= 陳述式5 --建立庫存資料表 CREATE TABLE Inventory (id INT, product NVARCHAR(100), qty INT) GO --新增初始庫存為0 INSERT INTO Inventory VALUES(1,'腳踏車',0) INSERT INTO Inventory VALUES(2,'溜冰鞋',0) INSERT INTO Inventory VALUES(3,'雪橇',0) GO================ ============= 陳述式6 -- 建立可以傳遞資料表值的預存程序 CREATE PROCEDURE myProc (@tvp myTableType READONLY) AS UPDATE Inventory SET qty+= tvp.qty – 累計數量,新的T-SQL方式 FROM Inventory AS i INNER JOIN @tvp AS tvp ON i.id = tvp.id GO================ ============= 陳述式7 --宣告資料表變數,新增資料列 DECLARE @list AS myTableType; INSERT INTO @list VALUES (1, '腳踏車', 10), (2, '溜冰鞋', 5) , (3, '雪橇', 25); EXEC myProc @list; --檢視整個結果 SELECT * FROM Inventory================ ============= 陳述式8 --建立含有階層代號的資料表 CREATE TABLE HumanResources.EmployeeDemo ( OrgNode hierarchyid, --本階階層資料行 EmployeeId int, LoginID nvarchar(50), Title nvarchar(100), HireDate datetime ) GO================ ============= 陳述式9 --新增一筆/3/1/1/資料 DECLARE @Manager hierarchyid SELECT @Manager = CAST('/3/1/' AS hierarchyid) --父節點 INSERT HumanResources.EmployeeDemo (OrgNode, LoginID, Title, HireDate) VALUES (@Manager.GetDescendant(NULL, NULL), N'阿強一號', N'微軟MCT講師', '2007/01/01') ; GO================ ============= 陳述式10 --宣告日期資料類型 DECLARE @d DATE SET @d=GETDATE() SELECT @d 'DATE日期格式' --宣告日期資料類型,其中@t1宣告精準位數為1位 DECLARE @t TIME,@t1 TIME(1) SET @t=GETDATE() SET @t1=GETDATE() SELECT @t 'TIME 時間格式',@t1 'TIME(1) 時間格式' --宣告DATETIME2的格式 DECLARE @dt2 DATETIME2 ,@dt DATETIME SET @dt2=GETDATE() SET @dt =GETDATE() SELECT @dt2 'DATETIME2日期時間格式',@dt 'DATETIME日期時間格式'================