使用特殊資料類型

此主題描述 SQL Server 中可用的特殊資料類型。特殊資料類型是指不屬於其他任何一種資料類型分類的資料類型。在 SQL Server 中,特殊資料類型包括 bit、hierarchyid、sql_variant、sysname、table、timestamp 和別名資料型別。

bit

bit 資料類型是儲存 0 或 1 的數值資料類型。字串值 true 和 false 可以轉換成 bit 值,如下列範例所示:

SELECT CONVERT (bit, 'true')
SELECT CONVERT(bit, 'false')

在這個範例中,true 會轉換成 1 而 false 會轉換成 0。bit 資料不需要括在單引號中。

hierarchyid

hierarchyid 資料類型可用來管理具有階層式結構的階層式資料和資料表。若要在 Transact-SQL 程式碼中使用階層式資料,請使用 hierarchyid 函數。如需詳細資訊,請參閱<使用 hierarchyid 資料類型 (Database Engine)>。

sql_variant

sql_variant 資料類型可讓單一資料行、參數或變數儲存不同資料類型的資料值。sql_variant 資料行的每個執行個體都會記錄此值和描述此值的中繼資料。下列中繼資料可以使用:

  • 基底資料型別

  • 大小上限

  • 小數位數

  • 有效位數

  • 定序

若要擷取特定 sql_variant 執行個體的中繼資料,請使用 SQL_VARIANT_PROPERTY 函數。

在下列範例中,第二份資料表包含 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))

sysname

sysname 資料類型可用於儲存物件名稱的資料表資料行、變數和預存程序參數。sysname 的確切定義與識別碼的規則有關。因此,它可能會隨著不同的 SQL Server 執行個體而改變。sysname 在功能上與 nvarchar(128) 相同,不同的是 sysname 預設為 NOT NULL。在舊版 SQL Server 中,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

timestamp 資料類型與時間或日期無關。timestamp 值是二進位數字,指出資料庫中發生資料修改的相對順序。

請勿在索引鍵中使用 timestamp 資料行 (尤其是主索引鍵),因為每次修改資料列時,timestamp 值就會變更。

若要記錄資料表中發生資料修改的時間,請使用 datetime2 或 smalldatetime 資料類型來記錄事件和觸發程序,以便在發生修改時,自動更新這些值。

別名資料型別

別名資料型別可讓您使用可針對特定用途自訂的描述性名稱和格式來擴充 SQL Server 基底資料型別 (例如 varchar)。例如,下列陳述式會實作 birthday 使用者定義資料類型,此資料類型是以 datetime 資料類型為基礎而且允許 Null 值 (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 轉換成字元格式的額外處理更重要。