首頁 培訓計劃 培訓課程 企業內訓 學員論壇 技術文章 成功案例 師資簡介 關于我們 在線留言  
數據庫資料
SQL 2008 T-Prep 上課心得

文章來源: 作者: 發布日期:2008-05-06
打 印】【關 閉

SQL Server 2008 提供的日期/時間格式

數據型態

格式

范圍

精確度

所占空間

使用者自定義局部秒精確度

時區位移

time

hh:mm:ss[.nnnnnnn]

00:00:00.0000000 ~  23:59:59.9999999

100 nanoseconds

3 ~ 5

date

YYYY-MM-DD

0001-01-01 ~  9999-12-31

1

3

smalldatetime

YYYY-MM-DD hh:mm:ss

1900-01-01 ~ 2079-06-06

1 minute

4

datetime

YYYY-MM-DD hh:mm:ss[.nnn]

1753-01-01 ~ 9999-12-31

0.00333 second

8

datetime2

YYYY-MM-DD hh:mm:ss[.nnnnnnn]

0001-01-01 00:00:00.0000000 ~ 9999-12-31 23:59:59.9999999

100 nanoseconds

6 ~ 8

datetimeoffset

YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm
 

0001-01-01 00:00:00.0000000 ~ 9999-12-31 23:59:59.9999999 (in UTC)

100 nanoseconds

8 ~ 10

·         變動的精確數可以節省空間

·         時間與日期分開,在利用 between and 取間隔時可方便許多 

·         舊的時間函數可以使用新的數據型態,提供新的時間函數以取得更精確的時間

數據表型態的參數

·         可以先定義數據表 Type,再宣告該型態的變量
CREATE TYPE mytab AS TABLE (id int);
DECLARE @t mytab;

·         傳遞數據表型態的參數是只讀的

T-SQL 語法增強

·         可以一行指令同時宣告變量與初始化值
DECLARE @i int = 4

·         C 格式的累加運算符,以下范例 @i 會變成 256,因為  2*2 -> 4*4 -> 16*16
DECLARE @i INT=2
SELECT TOP 3 @i*=@i FROM sys.objects
SELECT @i

·         單句話新增多筆記錄
DECLARE @t TABLE (id int, name varchar(20));
INSERT INTO @t VALUES (1, "Fred"), (2, "Jim"), (3, "Sue");

Grouping Sets
符合 ANSI 的標準語法,可以搭配 Group By 子句,取得以往 Rollup Cube 的效果。例如:

SELECT Country,TitleOfCourtesy,COUNT(EmployeeID) 匯總結果 FROM Employees
GROUP BY Grouping Sets(Country,TitleOfCourtesy,(Country,TitleOfCourtesy))
Order By Country DESC,TitleOfCourtesy

結果:
image

Merge 語法

·         來源與目的數據比較后,以一句話完成新增、修改、刪除等動作,如同單一句話自動會有交易,透過 Merge 語法所有數據更新的動作都包在一個交易內,不像以往需明確定義交易,然后包裝所有變更。

·         ANSI SQL 2006 相容并與以延伸

·         若用 UPDATE FROM JOIN 語法變更數據,若來源端有兩筆以上紀錄對應到目的端,則以哪一筆記錄更新將無法推測,Merge 語法則直接回傳錯誤

CREATE TABLE tbSource(C1 INT PRIMARY KEY,C2 NVARCHAR(10))
GO
INSERT tbSource VALUES(1,N""),(2,N"")
GO
SELECT * INTO tbDest FROM tbSource

DELETE tbSource WHERE c1=1
UPDATE tbSource SET c2=N"2" WHERE C1=2
INSERT tbSource VALUES(3,N"")

MERGE tbDest D
  USING tbSource s
  ON D.c1 = S.c1
  WHEN MATCHED THEN --修改
    UPDATE SET D.c2 = S.c2
  WHEN SOURCE NOT MATCHED THEN  --刪除
     DELETE
  WHEN TARGET NOT MATCHED THEN  --新增
    INSERT VALUES(c1, c2)
    OUTPUT $action, INSERTED.c1 [New c1],
                    INSERTED.c2 [New c2],
                    DELETED.c1  [Original c1],
                    DELETED.c2  [Original c2];

image

空間數據格式

·         提供兩種數據型態

·         Geometry:平面地球

·         Geography:圓地球

·         特殊數據型態是以 SQLCLR UDT 的方式實做

·         使用 "." 來存取屬性,或是呼叫實例的函數

·         使用 "::" 來呼叫靜態函數

·         函數屬性名稱要區分大小寫

·         結合微軟 Virtual Earth 建立 SQL 空間數據的范例網頁:http://mikeo.co.uk/demo/sqlspatial/default.aspx

Hierarchyid

·         SQLCLR UDT 實做的特殊數據型態

·         儲存有階層性的數據,便利維護樹狀結構,例如檔案架構、組織階層

·         提供 GetRoot、GetLevel、IsDescendant、GetDescendant、GetAncestor、Reparent 等方法

-- Step 1: 建立有階層特征的數據表
--         HierarchyID 可比較,因此可當作主鍵
CREATE TABLE tbEmployee
(
   OrgNode HierarchyID PRIMARY KEY CLUSTERED,
   OrgLevel AS OrgNode.GetLevel(),
   EmployeeID int UNIQUE NOT NULL,
   EmpName nvarchar(20) NOT NULL) ;
GO

-- Step 2: 建立 breadth-first 索引,也就是相同父親的數據放在一起
--         以數值 OrgLevel 放在前面,然后才是結點
CREATE UNIQUE INDEX EmployeeOrgNc1
ON tbEmployee(OrgLevel, OrgNode) ;
GO

-- Step 3: 加載數據
-- 載入根結點
INSERT tbEmployee(OrgNode, EmployeeID, EmpName)
VALUES (hierarchyid::GetRoot(), 1, N"") ;
GO

SELECT OrgNode.ToString() [文字描述階層],
OrgNode, OrgLevel, EmployeeID, EmpName
FROM tbEmployee ;

image


GO

--透過 GetDescendant 函數建立第一個子結點
DECLARE @Manager hierarchyid
SET @Manager = (SELECT OrgNode FROM tbEmployee WHERE EmployeeID = 1)

--加入子結點,因為是第一個子結點,所以不需要算位置
INSERT tbEmployee (OrgNode, EmployeeID, EmpName)
VALUES
(@Manager.GetDescendant(NULL, NULL), 12, N"") ;
GO

SELECT OrgNode.ToString() AS  [文字描述階層],
OrgNode, OrgLevel, EmployeeID, EmpName
FROM tbEmployee ;
GO

image

-- Step 4: 建立新增節點的共享預存程序
CREATE PROC AddEmp(@mgrid int, @empid int, @e_name nvarchar(20))
AS
BEGIN
   -- mOrgNode 父節點
   -- lc 該父節點的最后一個子結點
   DECLARE @mOrgNode hierarchyid, @lc hierarchyid
   SELECT @mOrgNode = OrgNode
   FROM tbEmployee
   WHERE EmployeeID = @mgrid

   SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
   BEGIN TRANSACTION
      SELECT @lc = max(OrgNode)
      FROM tbEmployee
      WHERE OrgNode.GetAncestor(1) =@mOrgNode ; --傳回上一階,相同父節點的最大子結點

      INSERT tbEmployee(OrgNode, EmployeeID, EmpName)
      VALUES(@mOrgNode.GetDescendant(@lc, NULL), @empid, @e_name) --將新增節點加在父節點最大的孩子旁
   COMMIT
END ;
GO

EXEC AddEmp 12, 121, N"";
EXEC AddEmp 12, 122, N"";
EXEC AddEmp 1, 13, N"";
EXEC AddEmp 121, 1211, N"";
EXEC AddEmp 13, 131, N"";
GO

SELECT OrgNode.ToString() AS  [文字描述階層],
OrgNode, OrgLevel, EmployeeID, SPACE(OrgNode.GetLevel()*5) + EmpName
FROM tbEmployee;

image

打 印】【關 閉

上一篇:Java多線程Socket操作猜數游戲樣例
下一篇:WebService是“良藥”還是“毒藥”
相關新聞
版權所有©威課網 粵ICP備13058727號