共用方式為


SQL Server 2008

全新的資料類型

Kelly Wilson

 

摘要:

  • 全新的日期和時間資料類型
  • 以階層表示位置
  • 處理空間資料的兩種模型

當前的全球化經濟環境下,企業被迫不斷改用新類型的資料、應用程式和複雜的計算作業。SQL Server 2008 內建的七種全新資料類型

提供了各種途徑,幫助您處理和簡化較複雜資料的管理工作。

日期和時間

使用舊版 datetime 資料類型的 SQL Server® 使用者無法分別處理日期和時間資訊。不過,新推出的四種資料類型 — date、time、datetime2 和 datetimeoffset — 則一改這種情況,不但簡化了處理日期和時間資料的工作,還提供更多日期範圍、毫秒精確度、時區支援。新的資料庫應用程式應該以這些新的資料類型,取代舊版的 datetime。現在我們就來看看這些新版本。

Date 資料類型只會儲存日期而不會儲存時間元件。其範圍是 1000 年 1 月 1 日到 9999 年 12 月 31 日 (0001-01-01 到 9999-12-31)。每個 date 變數都必須具備 3 位元組的儲存空間,以及 10 位數的精確度。而資料類型的準確度限於一天。

[圖 1] 示範如何以 T-SQL 指令碼建立和初始化 Date 變數。@myDate1 變數是由格式化為 'MM/DD/YYYY' 的字串加以初始化。@myDate2 變數並未初始化,其值為 NULL。@myDate3 變數是初始化成當地電腦系統上的日期。變數的值隨時都可以使用 SELECT 或 SET 陳述式加以變更,如變更 @myDate2 值的範例所示。資料表中也可以建立 Date 資料行。[圖 2] 顯示如何建立含三個日期資料行的資料表。

Figure 2 Create a table with three date columns

USE TempDB
GO

CREATE TABLE myTable
(
    myDate1 date,myDate2 date,myDate3 date
)
GO

INSERT INTO myTable
VALUES('01/22/2005',
       '2007-05-08 12:35:29.1234567 +12:15',
       GetDate())

SELECT * FROM myTable

--Results
--myDate1    myDate2    myDate3
------------ ---------- ----------
--2005-01-22 2007-05-08 2007-11-20

Figure 1 Create and initialize date variables in T-SQL scripts

DECLARE @myDate1 date = '01/22/2005'
DECLARE @myDate2 date
DECLARE @myDate3 date = GetDate()

SELECT @myDate2 = '2007-05-08 12:35:29.1234567 +12:15'

SELECT @myDate1 AS '@myDate1',
       @myDate2 AS '@myDate2',
       @myDate3 AS '@myDate3'

--Results
--@myDate1   @myDate2   @myDate3
------------ ---------- ----------
--2005-01-22 2007-05-08 2007-11-20

Time 資料類型只會儲存時間,而不會儲存任何日期元件。它採用 24 小時制,因此支援的範圍是 00:00:00.0000000 到 23:59:59.9999999 (小時、分鐘、秒和毫秒)。您可以在建立資料類型時指定毫秒的精確度。預設的精確度是 7 位數,準確度是 100ns。精確度會影響所需的儲存空間大小,範圍不等,從最多 2 位數需要 3 個位元組,3 或 4 位數需要 4 個位元組,一直到 5 至 7 位數需要 5 個位元組。

[圖 3] 中的 T-SQL 指令碼說明的是,字串初始化值的隱含轉換對變數精確度所產生的影響。T-SQL 程式碼會先建立八個不同的時間變數,並將它們初始化成相同的值。每個變數的小數點精確度與其名稱一樣。比如說,@myTime3 的精確度是是小數點後三位。結果顯示,每一個 time 資料類型的精確度,都跟宣告它的小數點精確度一樣。不在範圍內的位數則會截斷。

Figure 3 Display time data type's variable precision

DECLARE @myTime  time = '01:01:01.1234567 +01:01'
DECLARE @myTime1 time(1) = '01:01:01.1234567 +01:01'
DECLARE @myTime2 time(2) = '01:01:01.1234567 +01:01'
DECLARE @myTime3 time(3) = '01:01:01.1234567 +01:01'
DECLARE @myTime4 time(4) = '01:01:01.1234567 +01:01'
DECLARE @myTime5 time(5) = '01:01:01.1234567 +01:01'
DECLARE @myTime6 time(6) = '01:01:01.1234567 +01:01'
DECLARE @myTime7 time(7) = '01:01:01.1234567 +01:01'

SELECT @myTime  AS '@myTime',
       @myTime1 AS '@myTime1',
       @myTime2 AS '@myTime2',
       @myTime3 AS '@myTime3',
       @myTime4 AS '@myTime4',
       @myTime5 AS '@myTime5',
       @myTime6 AS '@myTime6',
       @myTime7 AS '@myTime7'

--Results
--@myTime          @myTime1   @myTime2    @myTime3     @myTime4      
------------------ ---------- ----------- ------------ -------------
--01:01:01.1234567 01:01:01.1 01:01:01.12 01:01:01.123 01:01:01.1235
--
--@myTime5       @myTime6        @myTime7
---------------- --------------- ----------------
--01:01:01.12346 01:01:01.123457 01:01:01.1234567

DROP TABLE myTable

您可將 time 資料類型建成資料表中的一個資料行。[圖 4] 中的 DROP TABLE myTable T-SQL 指令碼建立了一個名叫 myTable1 的資料表,並在資料表中新增三個時間資料行。資料表中接著會插入一筆記錄,而資料表的內容會以 SELECT 陳述式顯示。

Figure 4 Create myTable1

USE TempDB
GO

CREATE TABLE myTable1
(
    myTime1 time(1),
    myTime2 time(2),
    myTime3 time(3)
)
GO

INSERT INTO myTable1
VALUES('01:30:01.1234567',
       '02:34:01.1234567',
       '03:01:59.1234567')

SELECT * from myTable1

--Results
--myTime1    myTime2     myTime3
------------ ----------- ------------
--01:30:01.1000000 02:34:15.1200000 03:01:59.1230000

DROP TABLE myTable1

Datetimeoffset 和 Datetime2

Datetimeoffset 資料類型提供時區的感知能力。Time 資料類型並不包含時區,因此只能用於當地時間。然而,礙於全球化的經濟體制,往往有必要知道世界某地區與其他地區的時間關聯性。時區的偏差值是以 + 或 - hh:mm 表示。

這段程式碼會建立 datetimeoffset 變數,並將它初始化成時間值 8:52 A.M.。太平洋標準時間:

DECLARE @date DATETIMEOFFSET = '2007-11-26T08:52:00.1234567-08:00'
PRINT @date
--Results
--2007-11-26 08:52:00.1234567 -08:00

初始化 datetimeoffset 變數 (指令碼中的 @date) 的字串是經過特別的格式化,從最大量的元素依序排到最小量。它以一個大寫字母 T 分隔日期和時間元素,以負號區隔時間元素與時區,負號與時間或時區元素之間沒有空格。此格式是 datetimeoffset 資料類型所支援的兩種 ISO 8601 格式之一 (ISO 8601 是表示日期和時間值的一種國際標準)。

指定時間元件精確度的方式就跟 time 資料類型一樣,若未指定的話,會預設為相同的七位數。支援的範圍是一樣的。

Datetime2 資料類型是原始 datetime 類型的延伸,它支援的資料範圍較廣,毫秒精確度也比較高,而且還您指定精確度。datetime2 類型的資料範圍是 0001 年 1 月 1 日至 9999 年 12 月 31 日,與原始 datetime 的範圍 (從 1753 年 1 月 1 日至 9999 年 12 月 31 日) 不同。跟 time 類型一樣,它也提供七位數的毫秒精確度。原始的 datetime 類型提供三位數的精確度,以及 00:00:00 至 23:59:59.999 的時間範圍。下面我們將說明如何建立 datetime2 變數,並將它初始化成當地伺服器日期和時間:

DECLARE @datetime2 DATETIME2 = GetDate();
PRINT @datetime2

--Results
--2007-11-26 09:39:04.1370000

接下來我要探討的是全新的 hierarchyid 資料類型。這個資料類型處理的是資料表中各資料元素之間的關聯性,而不是處理特定的日期或時間資料。

Hierarchyid 資料類型

Hierarchyid 資料類型可讓您在資料表的各個資料元素之間建構關聯性,特別是以階層來表示位置。讓我們先使用 [圖 5] 中的指令碼建立 MyCompany 資料庫,然後填入員工資料,來探索這個資料類型。

Figure 5 Create and populate the MyCompany database

USE MASTER
GO

CREATE DATABASE MyCompany
GO
USE MyCompany
GO

--Create a table called employee that will store
--the data for the employees for MyCompany.
    
CREATE TABLE employee
(
    EmployeeID int NOT NULL,
    EmpName    varchar(20) NOT NULL,
    Title      varchar(20) NULL,
    Salary     decimal(18, 2) NOT NULL,
    hireDate   datetimeoffset(0) NOT NULL,
)
GO

--These statements will insert the data for the employees of MyCompany.

INSERT INTO employee
VALUES(6,   'David',  'CEO', 35900.00, '2000-05-23T08:30:00-08:00')

INSERT INTO employee
VALUES(46,  'Sariya', 'Specialist', 14000.00, '2002-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES(271, 'John',   'Specialist', 14000.00, '2002-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES(119, 'Jill',   'Specialist', 14000.00, '2007-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES(269, 'Wanida', 'Assistant', 8000.00, '2003-05-23T09:00:00-08:00')

INSERT INTO employee
VALUES(272, 'Mary',   'Assistant', 8000.00, '2004-05-23T09:00:00-08:00')
GO
--Results
--EmployeeID  EmpName Title      Salary   hireDate
------------- ------- ---------- -------- --------------------------
--6           David   CEO        35900.00 2000-05-23 08:30:00 -08:00
--46          Sariya  Specialist 14000.00 2002-05-23 09:00:00 -08:00
--271         John    Specialist 14000.00 2002-05-23 09:00:00 -08:00
--119         Jill    Specialist 14000.00 2007-05-23 09:00:00 -08:00
--269         Wanida  Assistant  8000.00  2003-05-23 09:00:00 -08:00
--272         Mary    Assistant  8000.00  2004-05-23 09:00:00 -08:00

[圖 6] 顯示最後產生的是內含一個員工資料表的簡單資料庫。MyCompany 資料庫中的這個員工資料表並沒有任何既定的結構。這在關聯式資料庫中並不罕見,因為結構是由應用程式透過其查詢和處理程式碼,以動態方式實施。

Figure 6 MyCompany 員工資料表

Figure 6** MyCompany 員工資料表 **

不過,商務資料一般則具有某種繼承結構。例如,每種業務都有一個報告結構,像是 [圖 7] 中所示的 MyCompany。MyCompany 的所有員工皆上呈 David,即 CEO。有些員工是直接報告,如 Jill 便是。其他人 (如 Mary) 則是透過媒介來報告。以程式設計的術語來說,MyCompany 的報告結構是稱為樹狀結構,正如其外觀所示。David 在最上層,不向任何人報告,他是父系或是上階。下面是向 David 報告的員工,這類節點稱為子系或子代。David 可以擁有任意數量的子代來代表他的直屬部下。

Figure 7 MyCompany 的組織結構

Figure 7** MyCompany 的組織結構 **(按影像可放大)

[圖 8] 中的指令碼是使用 hierarchyid 資料類型重建 MyCompany 資料庫,建構與 MyCompany 的報告結構相符的關聯性。首先,它以 ALTER TABLE 陳述式新增 hierarchyid 類型的資料行。接著再以 hierarchyid 的 GetRoot 方法,插入 David 的節點。隨後再以 GetDescendant 方法,將 David 的直屬新增到樹狀結構中。

Figure 8 Rebuild the database using hierarchyid

DELETE employee
GO
ALTER TABLE employee ADD OrgNode hierarchyid NOT NULL
GO

DECLARE @child hierarchyid,
@Manager hierarchyid = hierarchyid::GetRoot()

--The first step is to add the node at the top of the
--tree. Since David is the CEO his node will be the
--root node.

INSERT INTO employee
VALUES(6,   'David',  'CEO', 35900.00,
       '2000-05-23T08:30:00-08:00', @Manager)

--The next step is to insert the records for
--the employees that report directly to David.

SELECT @child = @Manager.GetDescendant(NULL, NULL)

INSERT INTO employee
VALUES(46,  'Sariya', 'Specialist', 14000.00,
       '2002-05-23T09:00:00-08:00', @child)

SELECT @child = @Manager.GetDescendant(@child, NULL)
INSERT INTO employee
VALUES(271, ‚John',   ‚Specialist', 14000.00,
       '2002-05-23T09:00:00-08:00', @child)

SELECT @child = @Manager.GetDescendant(@child, NULL)
INSERT INTO employee
VALUES(119, ‚Jill',   ‚Specialist', 14000.00,
       ‚2007-05-23T09:00:00-08:00', @child)

--We can now insert the employee that reports to
--Sariya.
SELECT @manager = OrgNode.GetDescendant(NULL, NULL)
FROM employee WHERE EmployeeID = 46

INSERT INTO employee
VALUES(269, ‚Wanida', ‚Assistant', 8000.00,
       ‚2003-05-23T09:00:00-08:00', @manager)

--Next insert the employee that report to John.
SELECT @manager = OrgNode.GetDescendant(NULL, NULL)
FROM employee WHERE EmployeeID = 271

INSERT INTO employee
VALUES(272, ‚Mary',   ‚Assistant', 8000.00,
       ‚2004-05-23T09:00:00-08:00', @manager)
GO

資料庫記錄一加入,還有階層一建構好,就可以使用像下面這樣的查詢來顯示員工資料表的內容:

SELECT EmpName, Title, Salary, OrgNode.ToString() AS OrgNode
FROM employee ORDER BY OrgNode
GO
--Results
--EmpName  Title      Salary    OrgNode
---------- ---------- --------- -------
--David    CEO        35900.00  /
--Sariya   Specialist 14000.00  /1/
--Wanida   Assistant  8000.00   /1/1/
--John     Specialist 14000.00  /2/
--Mary     Assistant  8000.00   /2/1/
--Jill     Specialist 14000.00  /3/

OrgNode 是 hierarchyid 資料行,結果當中的每個正斜線 / 字元,都代表階層樹狀結構當中的一個節點。David 位於根目錄,以一個正斜線表示。Sariya、John 和 Jill 都向 David 報告,而且有兩個正斜線標記,表示他們是階層中的第二個節點。數字 1、2 或 3 代表各個子節點的順序。這個系統彈性很大,必要時,可以移除、插入或新增子節點。比方說,假設我們在 John 和 Jill 之間加入一名員工,該名員工在結果當中的表示法就是:/2.1/.

比方說,如果要回答「誰向 Sariya 報告?」這個問題,可以使用下列 T-SQL 程式碼建立如下所示的查詢:

DECLARE @Sariya hierarchyid

SELECT @Sariya = OrgNode
FROM employee WHERE EmployeeID = 46

SELECT EmpName, Title, Salary, OrgNode.ToString() AS 'OrgNode'
FROM employee
WHERE OrgNode.GetAncestor(1) = @Sariya
GO
--Results
--EmpName Title     Salary  OrgNode
--------- --------- ------- -------
--Wanida  Assistant 8000.00 /1/1/

該項查詢是使用 hierarchyid 的 GetAncestor 方法,這個方法會傳回目前 hierarchyid 節點的父系。在前一段程式碼中,@Sariya 變數是設為 Sariya 的階層節點。這是因為 Sariya 是所有向她報告的員工的直屬上階。因此,如果要編寫一個查詢,傳回直接向 Sariya 報告的員工,其步驟包括從樹狀結構擷取 Sariya 的節點,然後選取其上階節點是 Sariya 的節點的全部節點。

Hierarchyid 資料行通常極為精簡,因為在樹狀結構中表示節點所需的位元數,會視節點的平均子系數目而定 (一般稱為節點的 Fanout)。例如,在有 100,000 名員工的組織階層中具有平均六層 Fanout 的新節點,可能要耗用五個位元組來儲存。

Hierarchyid 資料類型提供的數種方法,可以更有效的處理階層化資料。[圖 9] 顯示了這些方法的摘要。有關所有方法的詳細資訊,可在《SQL Server 線上叢書》(msdn2.microsoft.com/ms130214) 取得。

Figure 9 Methods provided by the hierarchyid data type

方法 描述
GetAncestor 傳回代表此 hierarchyid 節點第 n 個上階的 hierarchyid。
GetDescendant 傳回此 hierarchyid 節點的子節點。
GetLevel 傳回在整體階層中代表此 hierarchyid 節點深度的整數。
GetRoot 傳回此階層樹狀結構的根 hierarchyid 節點。靜態。
IsDescendant 若傳入的子節點是此 hierarchyid 節點的子代,則傳回 true。
Parse 將階層的字串表示轉換成 hierarchyid 值。靜態。
Reparent 將階層的節點移到階層內的新位置。
ToString 傳回內含此 hierarchyid 的邏輯表示的字串。

空間資料類型

空間資料是指識別地理位置和形狀 (主要是地球上) 的資料,包括景點、道路,甚至是營業地點。SQL Server 2008 提供了 geography 和 geometry 資料類型來處理這類的資料。

Geography 資料類型是處理圓面地球 (round-earth) 資訊。圓面地球模型會將地球的曲面列入它的計算考量當中。定位資訊是以經度和緯度表示。這個模型非常適合一些會參考地球表面的應用程式,諸如海外貨運、軍事規劃和短程應用程式等。如果您的資料是以經緯度儲存的話,這正是您該使用的模型。

Geometry 資料類型則是採用平面地球或平面模型。這種模型是將地球視為從已知點開始的平面投影。平面地球模型並不會將地球的曲面列入考慮,因此它主要是用於描述短程距離 — 例如在資料庫應用程式中對應建築的內部。

Geography 和 geometry 類型是從向量物件建構而成,以 Well-Known Text (WKT) 或 Well-Known Binary (WKB) 格式指定。這些是 Open Geospatial Consortium (OGC) Simple Features for SQL Specification 所描述的空間資料的傳輸格式。[圖 10] 所列的是 SQL Server 2008 支援的七種向量物件。

Figure 10 Vector objects supported by SQL Server 2008

物件 描述
Point 地點。
MultiPoint 一連串的點。
LineString 由線條連接的一連串零或多個點。
MultiLineString 一組 linestring。
Polygon 由一組封閉的 linestring 所描述的相鄰區域。
MultiPolygon 一組多邊形。
GeometryCollection geometry 類型的集合。

若要使用一或多個向量物件建構 geography 類型,必須先在 T-SQL 指令碼中宣告 geography 類型,如 [圖 11] 所示。接著呼叫 [圖 12] 所列的其中一個方法,然後傳遞向量物件的字元字串和空間參考識別碼 (Spatial Reference ID,SRID)。SRID 是空間參考識別系統,由 European Petroleum Survey Group 定義而成。它是針對儲存製圖學、測量和測地學資料所開發的一組標準的其中一部分。每個 SRID 都會識別一個特定類型的橢面,用於地理位置計算當中。之所以這麼做,是因為地球並不是完美的球體。SQL Server 2008 只能對相同的 SRID 執行計算。

Figure 12 Construct objects for geography and geometry

方法 描述
STGeomFromText 從輸入文字建構任何類型的 geography 例項。
STPointFromText 從輸入文字建構一個 geography Point 例項。
STMPointFromText 從輸入文字建構一個 geography MultiPoint 例項。
STLineFromText 從輸入文字建構一個 geography LineString 例項。
STMLineFromText 從輸入文字建構一個 geography MultiLineString 例項。
STPolyFromText 從輸入文字建構一個 geography Polygon 例項。
STMPolyFromText 從輸入文字建構一個 geography MultiPolygon 例項。
STGeomCollFromText 從輸入文字建構一個 geography GeometryCollection 例項。

Figure 11 Create points, lines, and polygon geometry

DECLARE @geo1 geometry
SELECT @geo1 = geometry::STGeomFromText('POINT (3 4)', 0)
PRINT @geo1.ToString()

DECLARE @geo2 geometry
SELECT @geo2 = geometry::Parse('POINT(3 4 7 2.5)')
PRINT @geo2.STX;
PRINT @geo2.STY;
PRINT @geo2.Z;
PRINT @geo2.M;

DECLARE @geo3 geography;
SELECT @geo3 = geography::STGeomFromText(
    'LINESTRING(47.656 -122.360, 47.656 -122.343)', 4326);
SELECT @geo3.ToString();

--Results
--POINT (3 4)
--3
--4
--7
--2.5

DECLARE @gx geometry; 
SET @gx = geometry::STPolyFromText(
    'POLYGON ((5 5, 10 5, 10 10, 5 5))', 0);
PRINT @gx.ToString();
--Results
--POLYGON ((5 5, 10 5, 10 10, 5 5))

Geography 和 Geometry 的差異

Geography 和 geometry 資料類型各自處理不同類型的資料,因此必須注意一些重大的差別。如果是使用 geometry 資料類型,則距離和面積的測量單位與例項的座標一樣。比如說,點 (0,0) 和 (6,8) 之間的距離永遠是 10 個單位。但 geography 類型就不同了,它使用的是以經緯度表示的橢面座標。

如果座標是以經緯度組表示,GEOMETRY 資料類型就會傳回前後不一致的結果。下面的 T-SQL 程式碼會計算點 (90 0) 和 (90 180) 之間的距離。這兩個點都是指北極,因此之間的距離應該是 0。如果是使用 GEOMETRY,計算出的距離是 180。

DECLARE @g1 GEOMETRY, @g2 GEOMETRY, @g3 GEOGRAPHY, @g4 GEOGRAPHY
SELECT @g1 = GEOMETRY::STGeomFromText('POINT (90 0)', 0)
SELECT @g2 = GEOMETRY::STGeomFromText('POINT (90 180)', 0)

SELECT @g3 = GEOGRAPHY::STGeomFromText('POINT (90 0)', 4326)
SELECT @g4 = GEOGRAPHY::STGeomFromText('POINT (90 180)', 4326)
SELECT @g2.STDistance(@g1) AS 'GEOMETRY',
       @g4.STDistance(@g3) AS 'GEOGRAPHY';

--Results
--GEOMETRY               GEOGRAPHY
------------------------ ----------------------
--180                    0

這兩種資料類型的空間資料方向也有所不同。在 geometry 資料類型所採用的平面系統中,多邊形的方向並不重要。舉例來說,座標為 ((0, 0), (10, 0), (0, 20), (0, 0)) 的多邊形,跟 ((0, 0), (0, 20), (10, 0), (0, 0)) 的多邊形並無不同。但是在 geography 資料類型所使用的資料模型中,如果沒有指定方向,多邊形就會模糊不清。以赤道圈為例,這個赤道圈所描述的多邊形,指的是北半球還是南半球呢?重點是,在使用地理位置資料時,必須精確的描述方向和地點。

SQL Server 2008 對 geography 資料類型還有其他一些限制。例如,每個地理位置例項必須容納在一個半球內。另外,它也不接受大型的空間物件,大型空間物件會產生 ArgumentException。如果這些方法得出的結果不能容納在一個半球內,則要求兩次輸入的 Geography 資料類型,便會傳回 NULL。

SQL Server 提供好幾種方法,允許在 geography 和 geometry 例項上執行一些作業。[圖 13] 是使用 SQL Server 2008 提供的方法來處理空間資料的幾個範例。礙於篇幅,我無法深入探討這個主題,但是您可以在《SQL Server 線上叢書》中找到完整的說明。

Figure 13 Working with spatial data

DECLARE @gm geometry;
DECLARE @gg geography;
DECLARE @h geography;

SET @gm = geometry::STGeomFromText('POLYGON((0 0, 13 0, 3 3, 0 13, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
SELECT @gm.STArea();

--Results
--38

SET @gg = geography::STGeomFromText('LINESTRING(0 0, 5 5)', 4326);
--Calculate the distance to a point slightly offset from the LINESTRING.
SET @h = geography::STGeomFromText('POINT(4 4)', 4326);
SELECT @gg.STDistance(@h);

--Results
-- 430.182777043046

--Calculate the distance to a point on the LINESTRING.
SET @h = geography::STGeomFromText('POINT(5 5)', 4326);
SELECT @gg.STDistance(@h);

--Results
-- 0

DECLARE @temp table ([name] varchar(10), [geom] geography);

INSERT INTO @temp values ('Point', geography::STGeomFromText('POINT(
5 10)', 4326));
INSERT INTO @temp values ('LineString', geography::STGeomFromText(
'LINESTRING(13 5, 50 25)', 4326));
--Calculate the distance to a point on the LINESTRING.
--Display the number of dimensions for a geography object stored in a --table variable.
INSERT INTO @temp values ('Polygon', geography::STGeomFromText(
'POLYGON((47.653 -122.358, 47.649 -122.348, 47.658 -122.348, 47.658 -122.358, 47.653 -122.358))', 4326));

SELECT [name], [geom].STDimension() as [dim]
FROM @temp;

--Results
--name       dim
------------ -----------
--Point      0
--LineString 1
--Polygon    2

希望這些關於 SQL Server 2008 七種新資料類型的資訊對您有所幫助。

Kelly Wilson 投入軟體工程已超過 20 年的時間,她的貢獻包括 SQL Server 的應用程式、3D 圖形、遊戲和色彩科學。Kelly 目前在 Microsoft 的 SQL Server 小組擔任程式設計作家。

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.