使用特殊資料
特殊資料類型是指不屬於其他任何一種資料類型分類的資料類型。例如,若要將資料儲存為 1 或 0,分別對應到在客戶調查中的是或否,可使用 bit 資料類型。Microsoft SQL Server 2005 有數種資料類型可符合此種分類方式:
bit
bit 資料不需要括在單引號 (') 中。它是類似於 SQL Server 整數和數值資料的數值資料,但是只能在 bit 資料行中儲存 0 和 1。字串值 true 和 false 可以轉換成下列所示的 bit 值。
SELECT CONVERT (bit, 'true'), CONVERT(bit, 'false')
True 會轉換成 1,而 False 會轉換成 0。
sql_variant
SQL Server 中的 sql_variant 資料類型允許單一資料行、參數或變數儲存不同資料類型的資料值。sql_variant 資料行的每一個例項都會記錄資料值與描述值的中繼資料,其中包含基底資料類型、大小上限、小數位數、有效位數與定序。下列範例中的第二個資料表包含 sql_variant 資料行:
CREATE TABLE ObjectTable (ObjectID int CONSTRAINT PKObjectTable PRIMARY KEY, ObjectName nvarchar(80), ObjectWeight decimal(10,3), ObjectColor nvarchar(20)) CREATE TABLE VariablePropertyTable (ObjectID int REFERENCES ObjectTable(ObjectID), PropertyName nvarchar(100), PropertyValue sql_variant, CONSTRAINT PKVariablePropertyTable PRIMARY KEY(ObjectID, PropertyName))
若要取得任何特定 sql_variant 執行個體的中繼資料資訊,請使用 SQL_VARIANT_PROPERTY 函數。
sysname
SQL Server 的執行個體包含名稱為 sysname 的使用者自訂資料類型。sysname 是用於資料表資料行、變數以及儲存物件名稱的預存程序參數。sysname 的確切定義與識別碼的規則有關;所以它可以在 SQL Server 執行個體之間改變。sysname 在功能上等同於 nvarchar(128)。SQL Server 6.5 版或舊版僅支援較小的識別碼;因此在舊版中,sysname 是定義為 varchar(30)。重要事項: 在區分大小寫或有二進位定序的的資料庫中,只有當 sysname 以小寫出現時,才識別為 SQL Server 系統資料類型。
table
table 資料類型像是暫存資料表,可以用來儲存結果集以供稍後處理。此種資料類型僅可用來定義 table 類型的本機變數,以及使用者自訂函數的傳回值。資料表變數或傳回值的定義包含資料行定義、資料類型、有效位數及每個資料行的小數位數,以及選擇性的 PRIMARY KEY、UNIQUE、NULL 及 CHECK 條件約束。使用者自訂資料類型無法當做資料類型使用。
table 變數中儲存的資料列格式或使用者自訂函數傳回的格式必須在宣告此變數或建立此函數時定義。此語法是以 CREATE TABLE 語法為基礎。例如:
DECLARE @TableVar TABLE (Cola int PRIMARY KEY, Colb char(3)) INSERT INTO @TableVar VALUES (1, 'abc') INSERT INTO @TableVar VALUES (2, 'def') SELECT * FROM @TableVar GO
傳回 table 的 table 變數和使用者自訂函數只能用於特定 SELECT 和 INSERT 陳述式中,而且 UPDATE、DELETE 及 DECLARE CURSOR 陳述式支援這些資料表。傳回 table 的 table 變數和使用者自訂函數無法用於任何其他 Transact-SQL 陳述式中。
套用至資料表的索引或其他條件約束必須當做 DECLARE 變數或 CREATE FUNCTION 陳述式的一部分進行定義。它們無法在後面套用,因為 CREATE INDEX 或 ALTER TABLE 陳述式無法參考資料表變數或使用者自訂函數。
如需有關定義 table 變數和使用者自訂函數所使用之語法的詳細資訊,請參閱 DECLARE @local\_variable (Transact-SQL) 和 CREATE FUNCTION (Transact-SQL)。
timestamp
SQL Server timestamp 資料類型只處理時間或日期。SQL Server timestamp 值是二進位數字,指出資料庫中發生資料修改的相對順序。實作 timestamp 資料類型原先是為了支援 SQL Server 復原的演算法。每次有分頁被修改時,就會以目前的 @@DBTS 值加上戳記,而 @@DBTS 會累加 1。這對復原來說已經足夠判斷分頁修改的相對順序,但是 timestamp 值與時間沒有關係。在 SQL Server 7.0 版和 SQL Server 2000 中,@@DBTS 只會針對在 timestamp 資料行中使用而遞增。如果資料表包含 timestamp 資料行,每次 INSERT、UPDATE 或 DELETE 陳述式修改資料列時,資料列中的 timestamp 值就會設定為目前的 @@DBTS 值,然後 @@DBTS 便遞增一。
請勿在索引鍵中使用 timestamp 資料行 (尤其是主索引鍵),因為每次修改資料列時,timestamp 值就會變更。
若要記錄資料表中發生資料修改的時間,請使用 datetime 或 smalldatetime 資料類型來記錄事件和觸發程序,以便在發生修改時,自動更新這些值。
別名資料類型
別名資料類型可讓您以描述性的名稱和特定用途的格式來擴充 SQL Server 基底資料類型 (例如 varchar)。例如,此陳述式使用 datetime 基底資料類型實作一個 birthday 使用者自訂資料類型,允許 NULL。EXEC sp_addtype birthday, datetime, 'NULL'
選擇實作使用者自訂資料類型的基底類型時,請特別小心。例如,在美國,社會安全碼的格式為 nnn-nn-nnnn。雖然社會安全碼含有數字,不過這些數字會構成識別碼而且不受數學運算的限制。因此,常見的作法是將使用者自訂的社會安全碼資料類型建立成 varchar,然後建立 CHECK 條件約束,以便強制將社會安全碼的格式儲存在資料表中:
EXEC sp_addtype SSN, 'VARCHAR(11)', 'NOT NULL' GO CREATE TABLE ShowSSNUsage (EmployeeID int PRIMARY KEY, EmployeeSSN SSN, CONSTRAINT CheckSSN CHECK ( EmployeeSSN LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' ) ) GO
如果 SSN 資料行通常當做索引 (尤其是叢集索引) 中的索引鍵資料行使用,而且 SSN 使用者自訂資料類型改為使用 int 基底資料類型實作時,索引鍵的大小就可以從 11 個位元組壓縮成 4 個位元組。縮減索引鍵的大小可改善資料擷取的速度。顯示或修改 SSN 值時,改善資料擷取效率和排除 CHECK 條件約束的需求通常會比從 int 轉換成字元格式的額外處理更重要。
請參閱
其他資源
CREATE FUNCTION (Transact-SQL)
資料類型 (Transact-SQL)
DECLARE @local\_variable (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)
資料表 (Transact-SQL)