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